文档

Java™ 教程-Java Tutorials 中文版
解析和格式化
Trail: Date Time
Lesson: Standard Calendar

解析和格式化

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

DateTimeFormatter 类提供了大量 预定义的格式化程序,或者你可以定义自己的格式化程序。

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

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


版本说明: java.time 日期时间对象可以直接与 java.util.FormatterString.format 一起使用,通过使用相似的基于模式的格式,原先用于遗留的 java.util.Datejava.util.Calendar 类。

解析

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

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 is not parsable!%n", input);
    throw exc;      // Rethrow the exception.
}
// 'date' has been successfully parsed

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

Non-ISO Date Conversion 页面上的 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 can't be formatted!%n", departure);
    throw exc;
}

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

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

Previous page: Instant Class
Next page: The Temporal Package