文档

Java™ 教程
隐藏目录
解析和格式化
路径: 日期 时间
课程: 标准日历

解析和格式化

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

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

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

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


版本说明: 可以直接使用java.time日期时间对象与java.util.FormatterString.format配合使用,使用与旧的java.util.Datejava.util.Calendar类相同的基于模式的格式化方式。

解析

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)

上一页: 快速课程
下一页: 时态包