解析和格式化

原文: https://docs.oracle.com/javase/tutorial/datetime/iso/format.html

Date-Time API 中基于时间的类提供解析方法,用于解析包含日期和时间信息的字符串。这些类还提供格式方法,用于格式化基于时间的对象以供显示。在这两种情况下,过程都类似:您为DateTimeFormatter提供一个模式来创建格式化程序对象。然后将该格式化器传递给解析格式方法。

DateTimeFormatter类提供了许多预定义格式化程序,或者您可以定义自己的格式化程序。

如果在转换过程中出现问题,解析格式方法会抛出异常。因此,您的解析代码应该捕获DateTimeParseException错误,并且您的格式代码应该捕获DateTimeException错误。有关异常处理的更多信息,请参阅捕获和处理异常

DateTimeFormatter类既是不可变的又是线程安全的;它可以(并且应该)在适当的时候分配给静态常量。


Version Note: The java.time date-time objects can be used directly with java.util.Formatter and String.format by using the familiar pattern-based formatting that was used with the legacy java.util.Date and java.util.Calendar classes.


解析

LocalDate类中的单参数 解析(CharSequence) 方法使用ISO_LOCAL_DATE格式化程序。要指定不同的格式化程序,可以使用双参数 解析(CharSequence,DateTimeFormatter) 方法。以下示例使用预定义的BASIC_ISO_DATE格式化程序,该格式化程序使用格式19590709于 1959 年 7 月 9 日。

  1. String in = ...;
  2. LocalDate date = LocalDate.parse(in, DateTimeFormatter.BASIC_ISO_DATE);

您还可以使用自己的模式定义格式化程序。来自 `Parse `示例的以下代码创建了应用“MMM d yyyy”格式的格式化程序。此格式指定表示月份的三个字符,表示月份日期的一个数字和表示年份的四个数字。使用此模式创建的格式化程序将识别诸如“2003 年 1 月 3 日”或“1994 年 3 月 23 日”之类的字符串。但是,要将格式指定为“MMM dd yyyy”,每月中有两个字符,那么您必须始终使用两个字符,填充零以表示一位数的日期:“2003 年 6 月 3 日”。

  1. String input = ...;
  2. try {
  3. DateTimeFormatter formatter =
  4. DateTimeFormatter.ofPattern("MMM d yyyy");
  5. LocalDate date = LocalDate.parse(input, formatter);
  6. System.out.printf("%s%n", date);
  7. }
  8. catch (DateTimeParseException exc) {
  9. System.out.printf("%s is not parsable!%n", input);
  10. throw exc; // Rethrow the exception.
  11. }
  12. // 'date' has been successfully parsed

DateTimeFormatter类的文档指定了完整的符号列表,可用于指定格式化或解析的模式。

非 ISO 日期转换页面上的StringConverter示例提供了日期格式化程序的另一个示例。

格式化

格式(DateTimeFormatter) 方法使用指定的格式将基于时间的对象转换为字符串表示。来自 `Flight `示例的以下代码使用格式“MMM d yyy hh:mm a”转换ZonedDateTime的实例。日期的定义方式与上一个解析示例的方式相同,但此模式还包括小时,分钟,以及下午和下午。组件。

  1. ZoneId leavingZone = ...;
  2. ZonedDateTime departure = ...;
  3. try {
  4. DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM d yyyy hh:mm a");
  5. String out = departure.format(format);
  6. System.out.printf("LEAVING: %s (%s)%n", out, leavingZone);
  7. }
  8. catch (DateTimeException exc) {
  9. System.out.printf("%s can't be formatted!%n", departure);
  10. throw exc;
  11. }

此示例的输出(打印到达和离开时间)如下:

  1. LEAVING: Jul 20 2013 07:30 PM (America/Los_Angeles)
  2. ARRIVING: Jul 21 2013 10:20 PM (Asia/Tokyo)