# 解析和格式化

> 原文： [https://docs.oracle.com/javase/tutorial/datetime/iso/format.html](https://docs.oracle.com/javase/tutorial/datetime/iso/format.html)

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

`DateTimeFormatter` 类提供了许多[预定义格式化程序](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#predefined)，或者您可以定义自己的格式化程序。

如果在转换过程中出现问题，`解析`和`格式`方法会抛出异常。因此，您的解析代码应该捕获 `DateTimeParseException` 错误，并且您的格式代码应该捕获 `DateTimeException` 错误。有关异常处理的更多信息，请参阅[捕获和处理异常](../../essential/exceptions/handling.html)。

`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）`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#parse-java.lang.CharSequence-) 方法使用 `ISO_LOCAL_DATE` 格式化程序。要指定不同的格式化程序，可以使用双参数 [`解析（CharSequence，DateTimeFormatter）`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#parse-java.lang.CharSequence-java.time.format.DateTimeFormatter-) 方法。以下示例使用预定义的 `BASIC_ISO_DATE` 格式化程序，该格式化程序使用格式 `19590709` 于 1959 年 7 月 9 日。

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

```

您还可以使用自己的模式定义格式化程序。来自 [``Parse` `](examples/Parse.java)示例的以下代码创建了应用“MMM d yyyy”格式的格式化程序。此格式指定表示月份的三个字符，表示月份日期的一个数字和表示年份的四个数字。使用此模式创建的格式化程序将识别诸如“2003 年 1 月 3 日”或“1994 年 3 月 23 日”之类的字符串。但是，要将格式指定为“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` 类的文档指定了[完整的符号列表](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns)，可用于指定格式化或解析的模式。

[非 ISO 日期转换](nonIso.html)页面上的 `StringConverter` 示例提供了日期格式化程序的另一个示例。

## 格式化

[`格式（DateTimeFormatter）`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#format-java.time.format.DateTimeFormatter-) 方法使用指定的格式将基于时间的对象转换为字符串表示。来自 [``Flight` `](examples/Flight.java)示例的以下代码使用格式“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)

```