Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改以获取Java SE 9及后续版本中更新的语言功能的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
日期时间API中的基于时间的类提供了用于解析包含日期和时间信息的字符串的parse方法。这些类还提供了用于将基于时间的对象格式化为显示的format方法。在两种情况下,过程相似:您提供一个模式给DateTimeFormatter来创建一个格式化对象。然后将该格式化对象传递给parse或format方法。
DateTimeFormatter类提供了许多预定义的格式化程序,或者您可以定义自己的格式化程序。
如果在转换过程中出现问题,parse和format方法会抛出异常。因此,您的解析代码应该捕获DateTimeParseException错误,您的格式化代码应该捕获DateTimeException错误。有关异常处理的更多信息,请参阅捕获和处理异常。
DateTimeFormatter类既是不可变的又是线程安全的;在适当的地方,它可以(并且应该)分配给一个静态常量。
LocalDate类中的单参数parse(CharSequence)方法使用ISO_LOCAL_DATE格式化程序。要指定不同的格式化程序,可以使用两个参数的parse(CharSequence, DateTimeFormatter)方法。下面的示例使用预定义的BASIC_ISO_DATE格式化程序,该程序使用19590709格式表示1959年7月9日。
String in = ...; LocalDate date = LocalDate.parse(in, DateTimeFormatter.BASIC_ISO_DATE);
您还可以使用自己的模式定义格式化程序。下面的代码来自Parse
示例,它创建了一个应用格式为"MMM d yyyy"的格式化程序。此格式指定三个字符表示月份,一个数字表示月份的日期,四个数字表示年份。使用此模式创建的格式化程序将识别诸如"Jan 3 2003"或"Mar 23 1994"的字符串。然而,要将格式指定为"MMM dd yyyy",即日期的日期为两个字符,则您必须始终使用两个字符,用零填充一个数字日期:"Jun 03 2003"。
String input = ...; try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy"); LocalDate date = LocalDate.parse(input, formatter); System.out.printf("%s%n", date); } catch (DateTimeParseException exc) { System.out.printf("%s 无法解析!%n", input); throw exc; // 重新抛出异常。 } // 'date' 已经成功解析
DateTimeFormatter类的文档指定了您可以使用的完整符号列表,用于指定格式化或解析的模式。
非ISO日期转换页面上的StringConverter示例提供了另一个日期格式化的示例。
format(DateTimeFormatter)方法使用指定的格式将基于时间的对象转换为字符串表示形式。下面的代码来自Flight示例,使用格式“MMM d yyy hh:mm a”将ZonedDateTime的实例转换为字符串。日期的定义方式与之前的解析示例相同,但此模式还包括小时、分钟以及上午和下午的组件。
ZoneId leavingZone = ...; ZonedDateTime departure = ...; try { DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM d yyyy hh:mm a"); String out = departure.format(format); System.out.printf("LEAVING: %s (%s)%n", out, leavingZone); } catch (DateTimeException exc) { System.out.printf("%s 无法格式化!%n", departure); throw exc; }
该示例的输出,打印了到达时间和出发时间,如下所示:
LEAVING: Jul 20 2013 07:30 PM (America/Los_Angeles) ARRIVING: Jul 21 2013 10:20 PM (Asia/Tokyo)