解析和格式化
Date-Time API 中基于时间的类提供了parse
个方法来解析包含日期和时间信息的字符串。这些类还提供format
方法,用于格式化基于时间的对象以供显示。在这两种情况下,过程都是相似的:您向DateTimeFormatter
提供了一个 Pattern 来创建格式化程序对象。然后将此格式化程序传递给parse
或format
方法。
DateTimeFormatter
类提供了许多predefined formatters,或者您可以定义自己的类。
如果转换过程中出现问题,则parse
和format
方法将引发异常。因此,您的解析代码应catchDateTimeParseException
错误,而格式代码应catchDateTimeException
错误。有关异常处理的更多信息,请参见catch和处理异常。
DateTimeFormatter
类是不可变的,并且是线程安全的;在适当的情况下,可以(并且应该)将其分配给静态常量。
Version Note:
通过使用与旧java\.util\.Date
和java\.util\.Calendar
类一起使用的熟悉的基于 Pattern 的格式,可以将java\.time
日期时间对象直接与java\.util\.Formatter
和String\.format
一起使用。
Parsing
LocalDate
类中的一参数parse(CharSequence)方法使用ISO_LOCAL_DATE
格式化程序。要指定其他格式程序,可以使用两个参数parse(CharSequence, DateTimeFormatter)方法。以下示例使用 预定义的BASIC_ISO_DATE
格式化程序,该格式在 1959 年 7 月 9 日使用19590709
格式。
String in = ...;
LocalDate date = LocalDate.parse(in, DateTimeFormatter.BASIC_ISO_DATE);
您也可以使用自己的 Pattern 定义格式器。以下来自Parse示例的代码创建一个格式化程序,该格式化程序应用“ MMM d yyyy”格式。此格式指定三个字符代表月份,一位数字代表月份中的日期,四位数字代表年份。使用此 Pattern 创建的格式化程序将识别字符串,例如“ Jan 3 2003”或“ Mar 23 1994”。但是,要将格式指定为“ MMM dd yyyy”,在一个月的日期中使用两个字符,则必须始终使用两个字符,用一位数字填充零以表示一个数字的日期:“ 2003 年 6 月 3 日”。
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
类的文档指定了完整的符号列表,您可以使用完整的符号列表来指定格式或解析的 Pattern。
非 ISO 日期转换页面上的StringConverter
示例提供了日期格式化程序的另一个示例。
Formatting
format(DateTimeFormatter)方法使用指定的格式将基于时间的对象转换为字符串 表示形式。以下来自Flight示例的代码使用格式“ MMM d yyy hh:mm a”转换ZonedDateTime
的实例。日期的定义方式与前面的解析示例所用的方式相同,但是此 Pattern 还包括小时,分钟以及上午和下午。组件。
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)