模块 java.base

类 DateTimeFormatter

java.lang.Object
java.time.format.DateTimeFormatter

public final class DateTimeFormatter extends Object
用于打印和解析日期时间对象的格式化程序。

此类提供用于打印和解析的主要应用程序入口点,并提供 DateTimeFormatter 的常见实现:

  • 使用预定义常量,例如 ISO_LOCAL_DATE
  • 使用模式字母,例如 uuuu-MMM-dd
  • 使用本地化样式,例如 longmedium

DateTimeFormatterBuilder 提供了更复杂的格式化程序。

主要的日期时间类提供两种方法 - 一种用于格式化 format(DateTimeFormatter formatter) ,另一种用于解析 parse(CharSequence text, DateTimeFormatter formatter)

例如:

 LocalDate date = LocalDate.now();
 String text = date.format(formatter);
 LocalDate parsedDate = LocalDate.parse(text, formatter);
 

除了格式之外,还可以使用所需的 Locale、Chronology、ZoneId 和 DecimalStyle 创建格式化程序。

withLocale 方法返回一个覆盖locale的新格式化程序。locale会影响格式化和解析的某些方面。例如,ofLocalizedDate 提供了一个使用区域设置特定日期格式的格式化程序。

withChronology 方法返回一个覆盖年表的新格式化程序。如果被覆盖,日期时间值将在格式化之前转换为年表。在解析期间,日期时间值在返回之前被转换为年表。

withZone 方法返回一个覆盖区域的新格式化程序。如果被覆盖,日期时间值将在格式化之前转换为具有请求的 ZoneId 的 ZonedDateTime。在解析期间,在返回值之前应用 ZoneId。

withDecimalStyle 方法返回一个覆盖 DecimalStyle 的新格式化程序。 DecimalStyle 符号用于格式化和解析。

某些应用程序可能需要使用旧的 java.text.Format 类进行格式化。 toFormat() 方法返回 java.text.Format 的实现。

预定义格式化程序

预定义格式化程序
Formatter Description 示例
ofLocalizedDate(dateStyle) 具有来自locale的日期样式的格式化程序 '2011-12-03'
ofLocalizedTime(timeStyle) 具有来自locale的时间样式的格式化程序 '10:15:30'
ofLocalizedDateTime(dateTimeStyle) 具有来自locale的日期和时间样式的格式化程序 '2008 年 6 月 3 日 11:05:30'
ofLocalizedDateTime(dateStyle,timeStyle) 具有来自locale的日期和时间样式的格式化程序 '2008 年 6 月 3 日 11:05'
BASIC_ISO_DATE 基本 ISO 日期 '20111203'
ISO_LOCAL_DATE ISO 本地日期 '2011-12-03'
ISO_OFFSET_DATE 带偏移量的 ISO 日期 '2011-12-03+01:00'
ISO_DATE 有或没有偏移的 ISO 日期 '2011-12-03+01:00'; '2011-12-03'
ISO_LOCAL_TIME 无偏移时间 '10:15:30'
ISO_OFFSET_TIME 有偏差的时间 '10:15:30+01:00'
ISO_TIME 有或没有偏移的时间 '10:15:30+01:00'; '10:15:30'
ISO_LOCAL_DATE_TIME ISO 本地日期和时间 '2011-12-03T10:15:30'
ISO_OFFSET_DATE_TIME 带偏移量的日期时间 '2011-12-03T10:15:30+01:00'
ISO_ZONED_DATE_TIME 分区日期时间 '2011-12-03T10:15:30+01:00[欧洲/巴黎]'
ISO_DATE_TIME 带有 ZoneId 的日期和时间 '2011-12-03T10:15:30+01:00[欧洲/巴黎]'
ISO_ORDINAL_DATE 年份和年份 '2012-337'
ISO_WEEK_DATE 年和周 '2012-W48-6'
ISO_INSTANT 瞬间的日期和时间 '2011-12-03T10:15:30Z'
RFC_1123_DATE_TIME RFC 1123 / RFC 822 '2008 年 6 月 3 日星期二 11:05:30 GMT'

格式化和解析模式

模式基于一个简单的字母和符号序列。模式用于使用 ofPattern(String) ofPattern(String, Locale) 方法创建格式化程序。例如,"d MMM uuuu" 会将 2011-12-03 格式化为“2011 年 12 月 3 日”。从模式创建的格式化程序可以根据需要多次使用,它是不可变的并且是线程安全的。

例如:

 LocalDate date = LocalDate.now();
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
 String text = date.format(formatter);
 LocalDate parsedDate = LocalDate.parse(text, formatter);
 

所有字母“A”到“Z”和“a”到“z”都保留为模式字母。定义了以下模式字母:

图案字母和符号
符号 意义 推介会 示例
G 时代 文本 广告;公元; A
u 2004; 04
y year-of-era 2004; 04
D 一年中的某一天 数字 189
M/L month-of-year number/text 7; 07;七月;七月;杰
d 月日 数字 10
g 修改儒略日 数字 2451334
q/q 每季度 number/text 3; 03; Q3;第三季
Y 周年 1996; 96
w 基于一周的一周 数字 27
W week-of-month 数字 4
E 星期几 文本 周二;周二;吨
电子邮件 本地化的星期几 number/text 2; 02;周二;周二;吨
F 每月对齐周 数字 3
a 一天中的下午 文本 PM
B 一天中的一段时间 文本 在早晨
h 时钟时间上午下午 (1-12) 数字 12
K 上午-下午 (0-11) 数字 0
k 一天中的时钟小时(1-24) 数字 24
H 一天中的小时 (0-23) 数字 0
m 每小时 数字 30
s 第二分钟 数字 55
S 几分之一秒 分数 978
A 毫日 数字 1234
n 毫微秒 数字 987654321
N 纳米级 数字 1234000000
V 时区编号 区域编号 美国/洛杉矶; Z; -08:30
v 通用时区名称 区域名称 太平洋时间; PT
z 时区名称 区域名称 太平洋标准时间;太平洋标准时间
O 局部区域偏移 偏移-O GMT+8; GMT+08:00; UTC-08:00
X 区域偏移“Z”为零 偏移-X Z; -08; -0830; -08:30; -083015; -08:30:15
x 区域偏移 偏移-x +0000; -08; -0830; -08:30; -083015; -08:30:15
Z 区域偏移 偏移-Z +0000; -0800; -08:00
p 接下来垫 pad 修饰符 1
' 文本转义 delimiter
'' 单引号 文字 '
[ 可选部分开始
] 可选部分结束
# 留作将来使用
{ 留作将来使用
} 留作将来使用

模式字母的数量决定了格式。

Text:文本样式根据使用的模式字母的数量确定。少于 4 个模式字母将使用 short form 。恰好 4 个模式字母将使用 full form 。恰好 5 个模式字母将使用 narrow form 。模式字母“L”、“c”和“q”指定文本样式的独立形式。

Number:如果字母数为 1,则使用最小位数输出值且不进行填充。否则,位数用作输出字段的宽度,必要时用零填充值。以下模式字母对字母数有限制。只能指定 'c' 和 'F' 中的一个字母。最多可以指定“d”、“H”、“h”、“K”、“k”、“m”和“s”两个字母。最多可以指定三个字母“D”。

数字/文本:如果模式字母的数量为 3 或更多,请使用上面的文本规则。否则使用上面的数字规则。

分数: 以秒的分数形式输出纳秒级字段。纳秒值有九位,因此模式字母的个数为1到9。如果小于9,则纳秒值被截断,只输出最高有效位。

Year:字母数决定最小字段宽度,低于该宽度使用填充。如果字母数是两个,则使用 reduced 两位数形式。对于打印,这会输出最右边的两位数字。对于解析,这将使用 2000 的基值进行解析,从而得到 2000 到 2099(含)范围内的年份。如果字母数少于四个(但不是两个),则根据 SignStyle.NORMAL 仅输出负数年份的符号。否则,如果超出焊盘宽度,则输出符号,如 SignStyle.EXCEEDS_PAD

ZoneId:这会输出时区 ID,例如“欧洲/巴黎”。如果字母数为二,则输出时区 ID。任何其他字母计数都会抛出 IllegalArgumentException

区域名称:这会输出时区 ID 的显示名称。如果模式字母是“z”,则输出是夏令时感知区域名称。如果没有足够的信息来确定是否适用 DST,将使用忽略夏令时的名称。如果字母数是一、二或三,则输出简称。如果字母数为四,则输出全名。五个或更多字母抛出 IllegalArgumentException

如果模式字母是“v”,则输出提供忽略夏令时的区域名称。如果字母数为一,则输出简称。如果字母数为四,则输出全名。两个、三个和五个或更多字母抛出 IllegalArgumentException

偏移 X 和 x:这会根据模式字母的数量来格式化偏移量。一个字母只输出小时,例如“+01”,除非分钟不为零,在这种情况下也会输出分钟,例如“+0130”。两个字母输出小时和分钟,不带冒号,如'+0130'。三个字母输出小时和分钟,带冒号,如'+01:30'。四个字母输出小时和分钟以及可选的秒,没有冒号,例如'+013015'。五个字母输出小时和分钟以及可选的秒,带有冒号,例如'+01:30:15'。六个或更多字母抛出 IllegalArgumentException 。当要输出的偏移量为零时,模式字母“X”(大写)将输出“Z”,而模式字母“x”(小写)将输出“+00”、“+0000”或“+00” :00'。

偏移 O:对于非零偏移量,这会根据模式字母的数量格式化本地化偏移量。一个字母输出本地化偏移量的short形式,即本地化偏移量文本,例如'GMT',小时不带前导零,如果非零则可选2位分秒,以及冒号,例如'GMT+8 '.四个字母输出 满的 形式,这是本地化的偏移文本,例如“GMT”,具有 2 位数字小时和分钟字段,如果第二个字段非零,则可选,还有冒号,例如“GMT+08:00”。如果偏移量为零,则仅输出本地化文本。任何其他字母计数都会抛出 IllegalArgumentException

偏移 Z:这会根据模式字母的数量来格式化偏移量。一、二或三个字母输出小时和分钟,不带冒号,如'+0130'。当偏移量为零时,输出将为“+0000”。四个字母输出满的形式的局部偏移量,相当于四个字母的Offset-O。如果偏移量为零,则输出将是相应的本地化偏移量文本。五个字母输出小时、分钟,如果非零则带有可选的秒,带有冒号。如果偏移量为零,则输出“Z”。六个或更多字母抛出 IllegalArgumentException

可选部分:可选部分标记的工作方式与调用 DateTimeFormatterBuilder.optionalStart() DateTimeFormatterBuilder.optionalEnd() 完全相同。

焊盘修饰符: 修改紧随其后的模式以用空格填充。焊盘宽度由模式字母的数量决定。这与调用 DateTimeFormatterBuilder.padNext(int) 相同。

例如,'ppH' 输出在左侧用宽度为 2 的空格填充的一天中的小时数。

任何无法识别的字母都是错误的。除了'['、']'、'{'、'}'、'#'和单引号之外的任何非字母字符都将被直接输出。尽管如此,还是建议在您要直接输出的所有字符周围使用单引号,以确保将来的更改不会破坏您的应用程序。

解决

解析是作为一个两阶段操作来实现的。首先,使用格式化程序定义的布局解析文本,生成 Map 字段值、ZoneIdChronology 。其次,解析后的数据是resolved,通过验证、组合和简化各种字段成为更有用的字段。

此类提供了五种解析方法。其中四个执行解析和解析阶段。第五个方法 parseUnresolved(CharSequence, ParsePosition) 仅执行第一阶段,结果未解决。因此,它本质上是一个低级操作。

解析阶段由在此类上设置的两个参数控制。

ResolverStyle 是一个枚举,它提供三种不同的方法:严格、智能和宽松。智能选项是默认选项。可以使用 withResolverStyle(ResolverStyle) 进行设置。

withResolverFields(TemporalField...) 参数允许在解析开始之前过滤要解析的字段集。例如,如果格式化程序已经解析了年、月、月中日和年中日,那么有两种方法来解析日期:(年+月+月中日)和(年+年)。解析器字段允许选择两种方法之一。如果未设置解析器字段,则两种方法必须产生相同的日期。

解析单独的字段以形成完整的日期和时间是一个复杂的过程,其行为分布在多个类中。它遵循以下步骤:

  1. 年表确定。结果的年表要么是已解析的年表,要么如果未解析年表,则为此类上设置的年表,或者如果为空,则为 IsoChronology
  2. ChronoField 日期字段已解决。这是使用 Chronology.resolveDate(Map, ResolverStyle) 实现的。有关字段解析的文档位于 Chronology 的实现中。
  3. ChronoField 时间字段已解决。这记录在 ChronoField 上并且对所有年表都是相同的。
  4. 处理任何不是 ChronoField 的字段。这是使用 TemporalField.resolve(Map, TemporalAccessor, ResolverStyle) 实现的。有关字段解析的文档位于 TemporalField 的实现中。
  5. ChronoField 日期和时间字段被重新解析。这允许第四步中的字段生成 ChronoField 值并将它们处理为日期和时间。
  6. 如果每天至少有一个小时可用,则会形成 LocalTime。这涉及为分钟、秒和秒的小数部分提供默认值。
  7. 将根据已解决的任何日期和/或时间交叉检查任何剩余的未解决字段。因此,较早的阶段会将(年 + 月 + 月中的某天)解析为一个日期,而此阶段将检查该日期的星期几是否有效。
  8. 如果 超出天数 已被解析,则如果日期可用,则将其添加到日期中。
  9. 如果存在基于秒的字段,但 LocalTime 未被解析,则解析器确保毫秒、微秒和纳秒值可用于满足 ChronoField 的约定。如果丢失,这些将被设置为零。
  10. 如果日期和时间都被解析并且存在偏移量或区域,则会创建字段 ChronoField.INSTANT_SECONDS 。如果解析了偏移量,则偏移量将与 LocalDateTime 组合以形成瞬间,忽略任何区域。如果 ZoneId 在没有偏移的情况下被解析,那么该区域将与 LocalDateTime 结合使用 ChronoLocalDateTime.atZone(ZoneId) 的规则形成即时。如果 ZoneId 是从指示夏令时是否正在运行的区域名称中解析出来的,那么该事实将用于在本地时间线重叠处选择正确的偏移量。
实现要求:
这个类是不可变的和线程安全的。
自从:
1.8
  • 字段详细信息

    • ISO_LOCAL_DATE

      public static final DateTimeFormatter  ISO_LOCAL_DATE
      ISO 日期格式化程序,用于格式化或解析没有偏移量的日期,例如“2011-12-03”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展本地日期格式。格式包括:

      • year 为四位数或更多。 0000 到 9999 范围内的年份将预先填充零以确保为四位数。超出该范围的年份将带有前缀正号或负号。
      • 破折号
      • month-of-year 的两位数。这是用零预填充以确保两位数。
      • 破折号
      • day-of-month 的两位数。这是用零预填充以确保两位数。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_OFFSET_DATE

      public static final DateTimeFormatter  ISO_OFFSET_DATE
      ISO 日期格式化程序,用于格式化或解析带有偏移量的日期,例如“2011-12-03+01:00”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展偏移日期格式。格式包括:

      • ISO_LOCAL_DATE
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。解析不区分大小写。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_DATE

      public static final DateTimeFormatter  ISO_DATE
      ISO 日期格式化程序,它使用偏移量(如果可用)格式化或解析日期,例如“2011-12-03”或“2011-12-03+01:00”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展日期格式。格式包括:

      • ISO_LOCAL_DATE
      • 如果偏移量不可用,则格式完成。
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。解析不区分大小写。

      由于此格式化程序有一个可选元素,因此可能需要使用 parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery<?>...) 进行解析。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_LOCAL_TIME

      public static final DateTimeFormatter  ISO_LOCAL_TIME
      ISO 时间格式化程序,用于格式化或解析没有偏移量的时间,例如“10:15”或“10:15:30”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展本地时间格式。格式包括:

      • hour-of-day 的两位数。这是用零预填充以确保两位数。
      • 冒号
      • minute-of-hour 的两位数。这是用零预填充以确保两位数。
      • 如果秒数不可用,则格式完成。
      • 冒号
      • second-of-minute 的两位数。这是用零预填充以确保两位数。
      • 如果纳秒为零或不可用,则格式完成。
      • 一个小数点
      • nano-of-second 的一到九位数字。将根据需要输出尽可能多的数字。

      返回的格式化程序没有覆盖时间顺序或区域。它使用 STRICT 解析器样式。

    • ISO_OFFSET_TIME

      public static final DateTimeFormatter  ISO_OFFSET_TIME
      ISO 时间格式化程序,用于格式化或解析带有偏移量的时间,例如“10:15+01:00”或“10:15:30+01:00”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展偏移时间格式。格式包括:

      • ISO_LOCAL_TIME
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。解析不区分大小写。

      返回的格式化程序没有覆盖时间顺序或区域。它使用 STRICT 解析器样式。

    • ISO_TIME

      public static final DateTimeFormatter  ISO_TIME
      格式化或解析时间的 ISO 时间格式化程序,带有偏移量(如果可用),例如“10:15”、“10:15:30”或“10:15:30+01:00”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展偏移时间格式。格式包括:

      • ISO_LOCAL_TIME
      • 如果偏移量不可用,则格式完成。
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。解析不区分大小写。

      由于此格式化程序有一个可选元素,因此可能需要使用 parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery<?>...) 进行解析。

      返回的格式化程序没有覆盖时间顺序或区域。它使用 STRICT 解析器样式。

    • ISO_LOCAL_DATE_TIME

      public static final DateTimeFormatter  ISO_LOCAL_DATE_TIME
      ISO 日期时间格式化程序,用于格式化或解析没有偏移量的日期时间,例如“2011-12-03T10:15:30”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展偏移日期时间格式。格式包括:

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_OFFSET_DATE_TIME

      public static final DateTimeFormatter  ISO_OFFSET_DATE_TIME
      ISO 日期时间格式化程序,用于格式化或解析带有偏移量的日期时间,例如“2011-12-03T10:15:30+01:00”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展偏移日期时间格式。格式包括:

      • ISO_LOCAL_DATE_TIME
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。偏移解析是宽松的,它允许分钟和秒是可选的。解析不区分大小写。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_ZONED_DATE_TIME

      public static final DateTimeFormatter  ISO_ZONED_DATE_TIME
      类似 ISO 的日期时间格式化程序,用于格式化或解析带有偏移量和区域的日期时间,例如“2011-12-03T10:15:30+01:00[Europe/Paris]”。

      这将返回一个不可变的格式化程序,该格式化程序能够格式化和解析扩展 ISO-8601 扩展偏移日期时间格式以添加时区的格式。方括号中的部分不是 ISO-8601 标准的一部分。格式包括:

      • ISO_OFFSET_DATE_TIME
      • 如果区域 ID 不可用或者是 ZoneOffset,则格式完成。
      • 左方括号 '['。
      • zone ID 。这不是 ISO-8601 标准的一部分。解析区分大小写。
      • 一个右方括号 ']'。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_DATE_TIME

      public static final DateTimeFormatter  ISO_DATE_TIME
      类似 ISO 的日期时间格式化程序,它使用偏移量和区域(如果可用)格式化或解析日期时间,例如 '2011-12-03T10:15:30'、'2011-12-03T10:15:30+01 :00' 或 '2011-12-03T10:15:30+01:00[欧洲/巴黎]'。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展本地或偏移日期时间格式,以及指定时区的扩展非 ISO 格式。格式包括:

      • ISO_LOCAL_DATE_TIME
      • 如果偏移量不可用于格式化或解析,则格式化完成。
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。
      • 如果区域 ID 不可用或者是 ZoneOffset,则格式完成。
      • 左方括号 '['。
      • zone ID 。这不是 ISO-8601 标准的一部分。解析区分大小写。
      • 一个右方括号 ']'。

      由于此格式化程序有一个可选元素,因此可能需要使用 parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery<?>...) 进行解析。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_ORDINAL_DATE

      public static final DateTimeFormatter  ISO_ORDINAL_DATE
      ISO 日期格式化程序,用于格式化或解析没有偏移量的序号日期,例如“2012-337”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展序号日期格式。格式包括:

      • year 为四位数或更多。 0000 到 9999 范围内的年份将预先填充零以确保为四位数。超出该范围的年份将带有前缀正号或负号。
      • 破折号
      • day-of-year 的三个数字。这是用零预填充以确保三位数。
      • 如果偏移量不可用于格式化或解析,则格式化完成。
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。解析不区分大小写。

      由于此格式化程序有一个可选元素,因此可能需要使用 parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery<?>...) 进行解析。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_WEEK_DATE

      public static final DateTimeFormatter  ISO_WEEK_DATE
      ISO 日期格式化程序,用于格式化或解析没有偏移量的基于周的日期,例如“2012-W48-6”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展的基于周的日期格式。格式包括:

      • week-based-year 为四位数或更多。 0000 到 9999 范围内的年份将预先填充零以确保为四位数。超出该范围的年份将带有前缀正号或负号。
      • 破折号
      • 字母“W”。解析不区分大小写。
      • week-of-week-based-year 的两位数。这是用零预填充以确保三位数。
      • 破折号
      • day-of-week 的一位数字。该值从星期一 (1) 运行到星期日 (7)。
      • 如果偏移量不可用于格式化或解析,则格式化完成。
      • offset ID 。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。解析不区分大小写。

      由于此格式化程序有一个可选元素,因此可能需要使用 parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery<?>...) 进行解析。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • ISO_INSTANT

      public static final DateTimeFormatter  ISO_INSTANT
      格式化或解析 UTC 格式的 ISO 即时格式化程序,例如“2011-12-03T10:15:30Z”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 即时格式。格式化时,时刻将始终以“Z”为后缀以指示 UTC。始终输出第二分钟。纳秒级可根据需要输出零、三、六或九位数字。解析时,DateTimeFormatterBuilder.appendOffsetId() 的行为将用于解析偏移量,必要时将即时转换为 UTC。至少秒字段的时间是必需的。解析从零到九的小数秒。不使用本地化的十进制样式。

      这是一种特殊情况格式化程序,旨在允许 Instant 的人类可读形式。 Instant 类旨在仅代表一个时间点,并在内部存储从固定纪元 1970-01-01Z 开始的以纳秒为单位的值。因此,Instant 不能在不提供某种形式的时区的情况下被格式化为日期或时间。此格式化程序允许通过使用 ZoneOffset.UTC 提供合适的转换来格式化 Instant

      格式包括:

      返回的格式化程序没有覆盖时间顺序或区域。它使用 STRICT 解析器样式。

    • BASIC_ISO_DATE

      public static final DateTimeFormatter  BASIC_ISO_DATE
      ISO 日期格式化程序,用于格式化或解析没有偏移量的日期,例如“20111203”。

      这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 基本本地日期格式。格式包括:

      • year 的四位数字。仅支持 0000 到 9999 范围内的年份。
      • month-of-year 的两位数。这是用零预填充以确保两位数。
      • day-of-month 的两位数。这是用零预填充以确保两位数。
      • 如果偏移量不可用于格式化或解析,则格式化完成。
      • offset ID 没有冒号。如果偏移量有秒,那么它们将被处理,即使这不是 ISO-8601 标准的一部分。偏移解析是宽松的,它允许分钟和秒是可选的。解析不区分大小写。

      由于此格式化程序有一个可选元素,因此可能需要使用 parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery<?>...) 进行解析。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 STRICT 解析器样式。

    • RFC_1123_DATE_TIME

      public static final DateTimeFormatter  RFC_1123_DATE_TIME
      RFC-1123 日期时间格式化程序,例如“星期二,2008 年 6 月 3 日 11:05:30 GMT”。

      这将返回一个不可变的格式化程序,能够格式化和解析大多数 RFC-1123 格式。 RFC-1123 更新了 RFC-822,将年份从两位数更改为四位。此实现需要一个四位数的年份。此实现也不处理北美或军事区域名称,仅处理“GMT”和偏移量。

      格式包括:

      • 如果星期几不可用于格式化或解析,则跳转到星期几。
      • 三个英文字母day-of-week
      • 一个逗号
      • 空间
      • day-of-month 的一位或两位数字。
      • 空间
      • 三个英文字母month-of-year
      • 空间
      • year 的四位数字。仅支持 0000 到 9999 范围内的年份。
      • 空间
      • hour-of-day 的两位数。这是用零预填充以确保两位数。
      • 冒号
      • minute-of-hour 的两位数。这是用零预填充以确保两位数。
      • 如果第二分钟不可用,则跳转到下一个空间。
      • 冒号
      • second-of-minute 的两位数。这是用零预填充以确保两位数。
      • 空间
      • offset ID 没有冒号或秒。零偏移量使用“GMT”。不处理北美地区名称和军事地区名称。

      解析不区分大小写。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 SMART 解析器样式。

  • 方法详情

    • ofPattern

      public static DateTimeFormatter  ofPattern(String  pattern)
      使用指定的模式创建格式化程序。

      此方法将创建一个基于简单 字母和符号的图案 的格式化程序,如类文档中所述。例如,d MMM uuuu 会将 2011-12-03 格式化为“2011 年 12 月 3 日”。

      格式化程序将使用 default FORMAT locale 。这可以在返回的格式化程序上使用 withLocale(Locale) 进行更改。或者使用此方法的 ofPattern(String, Locale) 变体。

      返回的格式化程序没有覆盖时间顺序或区域。它使用 SMART 解析器样式。

      参数:
      pattern - 要使用的模式,不为空
      返回:
      基于模式的格式化程序,不为空
      抛出:
      IllegalArgumentException - 如果模式无效
      参见:
    • ofPattern

      public static DateTimeFormatter  ofPattern(String  pattern, Locale  locale)
      使用指定的模式和locale创建格式化程序。

      此方法将创建一个基于简单 字母和符号的图案 的格式化程序,如类文档中所述。例如,d MMM uuuu 会将 2011-12-03 格式化为“2011 年 12 月 3 日”。

      格式化程序将使用指定的locale。这可以在返回的格式化程序上使用 withLocale(Locale) 进行更改。

      返回的格式化程序没有覆盖时间顺序或区域。它使用 SMART 解析器样式。

      参数:
      pattern - 要使用的模式,不为空
      locale - 要使用的locale,不为空
      返回:
      基于模式的格式化程序,不为空
      抛出:
      IllegalArgumentException - 如果模式无效
      参见:
    • ofLocalizedDate

      public static DateTimeFormatter  ofLocalizedDate(FormatStyle  dateStyle)
      返回 ISO 年表的特定于locale的日期格式。

      这将返回一个将格式化或解析日期的格式化程序。使用的确切格式模式因区域设置而异。

      locale由格式化程序确定。此方法直接返回的格式化程序将使用 default FORMAT locale 。可以根据此方法的结果使用 withLocale(Locale) 来控制locale。

      请注意,本地化模式是惰性查找的。这个 DateTimeFormatter 包含所需的样式和locale,按需查找所需的模式。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 SMART 解析器样式。

      参数:
      dateStyle - 要获取的格式化程序样式,不为空
      返回:
      日期格式化程序,不为空
    • ofLocalizedTime

      public static DateTimeFormatter  ofLocalizedTime(FormatStyle  timeStyle)
      返回 ISO 年表的特定于locale的时间格式。

      这将返回一个将格式化或解析时间的格式化程序。使用的确切格式模式因区域设置而异。

      locale由格式化程序确定。此方法直接返回的格式化程序将使用 default FORMAT locale 。可以根据此方法的结果使用 withLocale(Locale) 来控制locale。

      请注意,本地化模式是惰性查找的。这个 DateTimeFormatter 包含所需的样式和locale,按需查找所需的模式。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 SMART 解析器样式。 FULLLONG 样式通常需要时区。使用这些样式进行格式化时,ZoneId 必须可用,可以使用 ZonedDateTimewithZone(java.time.ZoneId)

      参数:
      timeStyle - 要获取的格式化程序样式,不为空
      返回:
      时间格式化程序,不为空
    • ofLocalizedDateTime

      public static DateTimeFormatter  ofLocalizedDateTime(FormatStyle  dateTimeStyle)
      返回 ISO 年表的特定于locale的日期时间格式化程序。

      这将返回一个格式化程序,它将格式化或解析日期时间。使用的确切格式模式因区域设置而异。

      locale由格式化程序确定。此方法直接返回的格式化程序将使用 default FORMAT locale 。可以根据此方法的结果使用 withLocale(Locale) 来控制locale。

      请注意,本地化模式是惰性查找的。这个 DateTimeFormatter 包含所需的样式和locale,按需查找所需的模式。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 SMART 解析器样式。 FULLLONG 样式通常需要时区。使用这些样式进行格式化时,ZoneId 必须可用,可以使用 ZonedDateTimewithZone(java.time.ZoneId)

      参数:
      dateTimeStyle - 要获取的格式化程序样式,不为空
      返回:
      日期时间格式化程序,不为空
    • ofLocalizedDateTime

      public static DateTimeFormatter  ofLocalizedDateTime(FormatStyle  dateStyle, FormatStyle  timeStyle)
      返回 ISO 年表的特定于区域设置的日期和时间格式。

      这将返回一个格式化程序,它将格式化或解析日期时间。使用的确切格式模式因区域设置而异。

      locale由格式化程序确定。此方法直接返回的格式化程序将使用 default FORMAT locale 。可以根据此方法的结果使用 withLocale(Locale) 来控制locale。

      请注意,本地化模式是惰性查找的。这个 DateTimeFormatter 包含所需的样式和locale,按需查找所需的模式。

      返回的格式化程序设置了 ISO 年表,以确保正确转换其他日历系统中的日期。它没有覆盖区域并使用 SMART 解析器样式。 FULLLONG 样式通常需要时区。使用这些样式进行格式化时,ZoneId 必须可用,可以使用 ZonedDateTimewithZone(java.time.ZoneId)

      参数:
      dateStyle - 要获取的日期格式化程序样式,不为空
      timeStyle - 要获取的时间格式化程序样式,不为空
      返回:
      日期、时间或日期时间格式化程序,不为空
    • ofLocalizedPattern

      public static DateTimeFormatter  ofLocalizedPattern(String  requestedTemplate)
      创建一个从所请求的 ISO 年表模板派生的特定于区域设置的格式化程序。请求的模板是一系列典型的模式符号,按照日期或时间单位从大到小的规范顺序排列,可以用以下正则表达式表示:
         "G{0,5}" +    // Era
         "y*" +      // Year
         "Q{0,5}" +    // Quarter
         "M{0,5}" +    // Month
         "w*" +      // Week of Week Based Year
         "E{0,5}" +    // Day of Week
         "d{0,2}" +    // Day of Month
         "B{0,5}" +    // Period/AmPm of Day
         "[hHjC]{0,2}" +  // Hour of Day/AmPm (refer to LDML for 'j' and 'C')
         "m{0,2}" +    // Minute of Hour
         "s{0,2}" +    // Second of Minute
         "[vz]{0,4}"    // Zone
       
      所有模式符号都是可选的,每个模式符号代表一个字段,例如'M'代表月份字段。模式符号字母的数量遵循与格式化和解析模式部分中相同的表示形式,例如“数字”或“文本”。所请求模板中的其他模式符号无效。

      请求的模板到最接近的可用本地化格式的映射由 Unicode LDML 规范 定义。例如,从请求的模板 yMMM 创建的格式化程序会将 US locale 中的日期“2020-06-16”格式化为“2020 年 6 月”。

      locale由格式化程序确定。此方法直接返回的格式化程序使用 default FORMAT locale 。可以根据此方法的结果使用 withLocale(Locale) 来控制locale。

      返回的格式化程序没有覆盖区域。它使用 SMART 解析器样式。

      参数:
      requestedTemplate - 请求的模板,不为空
      返回:
      基于 requestedTemplate 模式的格式化程序,不为空
      抛出:
      IllegalArgumentException - 如果 requestedTemplate 无效
      自从:
      19
      参见:
    • parsedExcessDays

      public static final TemporalQuery <Period > parsedExcessDays()
      提供对已解析的多余天数的访问的查询。

      这将返回一个单例 query,它提供对来自解析的附加信息的访问。查询总是返回一个非空句点,返回一个零句点而不是空句点。

      在两种情况下,此查询可能会返回非零句点。

      • 如果 ResolverStyleLENIENT 并且解析的时间没有日期,则解析的完整结果由 LocalTime 和超出的 Period 天数组成。
      • 如果 ResolverStyleSMART 并且解析了一个没有日期的时间,其中时间是 24:00:00,那么解析的完整结果包括 00:00:00 的 LocalTime 和一天的多余 Period

      在这两种情况下,如果解析了完整的 ChronoLocalDateTimeInstant,则会将多余的天数添加到日期部分。因此,此查询将返回一个零句点。

      SMART 行为处理常见的“一天结束”24:00 值。在 LENIENT 模式下处理也产生相同的结果:

       Text to parse    Parsed object             Excess days
       "2012-12-03T00:00"  LocalDateTime.of(2012, 12, 3, 0, 0)  ZERO
       "2012-12-03T24:00"  LocalDateTime.of(2012, 12, 4, 0, 0)  ZERO
       "00:00"       LocalTime.of(0, 0)          ZERO
       "24:00"       LocalTime.of(0, 0)          Period.ofDays(1)
       
      查询可以按如下方式使用:
       TemporalAccessor parsed = formatter.parse(str);
       LocalTime time = parsed.query(LocalTime::from);
       Period extraDays = parsed.query(DateTimeFormatter.parsedExcessDays());
       
      返回:
      提供对已解析的多余天数的访问的查询
    • parsedLeapSecond

      public static final TemporalQuery <Boolean > parsedLeapSecond()
      提供对是否解析闰秒的访问的查询。

      这将返回一个单例 query,它提供对来自解析的附加信息的访问。查询总是返回一个非空boolean,如果解析看到闰秒则返回 true,否则返回 false。

      即时解析处理特殊的“闰秒”时间“23:59:60”。闰秒出现在 UTC 时区的“23:59:60”,但出现在不同时区的其他当地时间。为避免这种潜在的歧义,闰秒的处理仅限于 DateTimeFormatterBuilder.appendInstant() ,因为该方法始终使用 UTC 时区偏移量解析瞬间。

      如果接收到时间“23:59:60”,则应用简单转换,将秒数 60 替换为 59。此查询可用于解析结果以确定是否进行了闰秒调整制成。如果确实调整以删除闰秒,查询将返回 true,否则返回 false。请注意,应用闰秒平滑机制(例如 UTC-SLS)是应用程序的责任,如下所示:

       TemporalAccessor parsed = formatter.parse(str);
       Instant instant = parsed.query(Instant::from);
       if (parsed.query(DateTimeFormatter.parsedLeapSecond())) {
        // validate leap-second is correct and apply correct smoothing
       }
       
      返回:
      提供对是否解析闰秒的访问的查询
    • getLocale

      public Locale  getLocale()
      获取格式化期间要使用的locale。

      这用于查找需要特定本地化的格式化程序的任何部分,例如文本或本地化模式。

      返回:
      此格式化程序的locale,不为空
    • withLocale

      public DateTimeFormatter  withLocale(Locale  locale)
      使用新的locale返回此格式化程序的副本。

      这用于查找需要特定本地化的格式化程序的任何部分,例如文本或本地化模式。

      locale按传入的方式存储,无需进一步处理。如果locale有 Unicode 扩展 ,它们可能会在稍后的文本处理中使用。要从 unicode 扩展设置年表、时区和小数样式,请参阅 localizedBy()

      此实例是不可变的,不受此方法调用的影响。

      参数:
      locale - 新locale,不为空
      返回:
      基于此格式化程序的格式化程序,具有请求的locale,不为空
      参见:
    • localizedBy

      public DateTimeFormatter  localizedBy(Locale  locale)
      返回此格式化程序的副本,其中包含区域设置、日历、区域、十进制样式和/或时区的本地化值,这些值将取代此格式化程序中的值。

      这用于查找需要特定本地化的格式化程序的任何部分,例如文本或本地化模式。如果locale包含“ca”(日历)、“nu”(编号系统)、“rg”(区域覆盖)和/或“tz”(时区)Unicode 扩展,则年表、编号系统和/或区域是覆盖。如果同时指定了“ca”和“rg”,则“ca”扩展中的年表将取代“rg”扩展中的隐式年表。 “nu”扩展也是如此。

      withLocale 方法不同,对该方法的调用可能会产生不同的格式化程序,具体取决于与其他 withXXXX() 方法的方法链接顺序。

      此实例是不可变的,不受此方法调用的影响。

      参数:
      locale - locale,不为空
      返回:
      基于此格式化程序的格式化程序,具有日历、小数样式和/或时区的本地化值,取代此格式化程序中的值。
      自从:
      10
      参见:
    • getDecimalStyle

      public DecimalStyle  getDecimalStyle()
      获取要在格式化期间使用的 DecimalStyle。
      返回:
      此格式化程序的 DecimalStyle,不为空
    • withDecimalStyle

      public DateTimeFormatter  withDecimalStyle(DecimalStyle  decimalStyle)
      使用新的 DecimalStyle 返回此格式化程序的副本。

      此实例是不可变的,不受此方法调用的影响。

      参数:
      decimalStyle - 新的 DecimalStyle,不为空
      返回:
      基于此格式化程序的格式化程序,具有请求的 DecimalStyle,不为空
    • getChronology

      public Chronology  getChronology()
      获取要在格式化期间使用的重写年表。

      这将返回用于转换日期的覆盖年表。默认情况下,格式化程序没有覆盖年表,返回 null。有关覆盖的更多详细信息,请参阅 withChronology(Chronology)

      返回:
      此格式化程序的重写年表,如果没有重写则为 null
    • withChronology

      public DateTimeFormatter  withChronology(Chronology  chrono)
      使用新的重写年表返回此格式化程序的副本。

      这将返回一个与此格式化程序具有相似状态但设置了重写年表的格式化程序。默认情况下,格式化程序没有重写年表,返回 null。

      如果添加重写,则任何格式化或解析的日期都会受到影响。

      格式化时,如果时间对象包含日期,则它将转换为覆盖年表中的日期。时间是否包含日期是通过查询EPOCH_DAY 字段来确定的。除非被覆盖,否则任何时间或区域都将保持不变。

      如果时间对象不包含日期,但包含一个或多个 ChronoField 日期字段,则抛出 DateTimeException。在所有其他情况下,将覆盖年表添加到时间中,替换任何以前的年表,但不更改日期/时间。

      解析时,有两种不同的情况需要考虑。如果年表是直接从文本中解析出来的,可能是因为使用了DateTimeFormatterBuilder.appendChronologyId() ,那么这个覆盖年表就没有效果。如果未解析任何区域,则此覆盖年表将用于根据年表的日期解析规则将ChronoField值解释为日期。

      此实例是不可变的,不受此方法调用的影响。

      参数:
      chrono - 新的年表,如果没有覆盖则为 null
      返回:
      基于此格式化程序的格式化程序,具有请求的重写年表,不为空
    • getZone

      public ZoneId  getZone()
      获取要在格式化期间使用的重写区域。

      这将返回用于转换瞬间的覆盖区域。默认情况下,格式化程序没有覆盖区域,返回 null。有关覆盖的更多详细信息,请参见 withZone(ZoneId)

      返回:
      此格式化程序的重写区域,如果没有重写则为 null
    • withZone

      public DateTimeFormatter  withZone(ZoneId  zone)
      返回具有新重写区域的此格式化程序的副本。

      这将返回一个与此格式化程序具有相似状态但设置了重写区域的格式化程序。默认情况下,格式化程序没有重写区域,返回 null。

      如果添加重写,则任何格式化或解析的瞬间都会受到影响。

      格式化时,如果时间对象包含一个瞬间,则它将使用覆盖区域转换为分区日期时间。通过查询INSTANT_SECONDS 字段来确定时间是否为瞬间。如果输入有时间顺序,那么除非被覆盖,否则它将被保留。如果输入没有年表,例如 Instant ,那么将使用 ISO 年表。

      如果时间对象不包含瞬间,但包含偏移量,则进行额外检查。如果规范化覆盖区域的偏移量与时间偏移量不同,则会抛出 DateTimeException。在所有其他情况下,覆盖区域被添加到临时区域,替换任何以前的区域,但不更改日期/时间。

      解析时,有两种不同的情况需要考虑。如果一个区域是直接从文本中解析出来的,可能是因为使用了DateTimeFormatterBuilder.appendZoneId() ,那么这个覆盖区域就没有效果。如果未解析任何区域,则此覆盖区域将包含在解析结果中,可用于构建瞬间和日期时间。

      此实例是不可变的,不受此方法调用的影响。

      参数:
      zone - 新的覆盖区域,如果没有覆盖则为 null
      返回:
      基于此格式化程序的格式化程序,具有请求的重写区域,不为空
    • getResolverStyle

      public ResolverStyle  getResolverStyle()
      获取在解析期间使用的解析器样式。

      这将返回解析器样式,在解析的第二阶段将字段解析为日期和时间时使用。默认情况下,格式化程序具有 SMART 解析器样式。有关详细信息,请参阅 withResolverStyle(ResolverStyle)

      返回:
      此格式化程序的解析器样式,不为空
    • withResolverStyle

      public DateTimeFormatter  withResolverStyle(ResolverStyle  resolverStyle)
      使用新的解析器样式返回此格式化程序的副本。

      这将返回一个与此格式化程序具有相似状态但具有解析器样式集的格式化程序。默认情况下,格式化程序具有 SMART 解析器样式。

      更改解析器样式仅在解析期间有效。解析文本字符串分两个阶段进行。阶段 1 是根据添加到构建器的字段进行基本文本解析。阶段 2 将解析的字段值对解析为日期和/或时间对象。解析器样式用于控制第 2 阶段解析的发生方式。有关可用选项的更多信息,请参阅 ResolverStyle

      此实例是不可变的,不受此方法调用的影响。

      参数:
      resolverStyle - 新的解析器样式,不为空
      返回:
      基于此格式化程序的格式化程序,具有请求的解析器样式,不为空
    • getResolverFields

      public Set <TemporalField > getResolverFields()
      获取要在解析期间使用的解析器字段。

      这将返回解析器字段,在解析的第二阶段将字段解析为日期和时间时使用。默认情况下,格式化程序没有解析器字段,因此返回 null。有关详细信息,请参阅 withResolverFields(Set)

      返回:
      此格式化程序的不可变解析器字段集,如果没有字段则为 null
    • withResolverFields

      public DateTimeFormatter  withResolverFields(TemporalField ... resolverFields)
      使用一组新的解析器字段返回此格式化程序的副本。

      这将返回一个与此格式化程序状态相似但设置了解析器字段的格式化程序。默认情况下,格式化程序没有解析器字段。

      更改解析器字段仅在解析期间有效。解析文本字符串分两个阶段进行。阶段 1 是根据添加到构建器的字段进行基本文本解析。阶段 2 将解析的字段值对解析为日期和/或时间对象。解析器字段用于过滤阶段 1 和阶段 2 之间的字段值对。

      这可用于在两种或多种解决日期或时间的方式之间进行选择。例如,如果格式化程序由年、月、月中日和年中日组成,那么有两种方法可以解析日期。使用参数 YEAR DAY_OF_YEAR 调用此方法将确保使用年份和年份解析日期,这实际上意味着在解析阶段忽略月份和日期。

      以类似的方式,此方法可用于忽略否则会被交叉检查的辅助字段。例如,如果格式化程序由年、月、月中日和星期几组成,那么只有一种方法可以解析日期,但解析后的星期几值将被交叉检查反对解决的日期。使用参数 YEAR MONTH_OF_YEAR DAY_OF_MONTH 调用此方法将确保正确解析日期,但不会对星期几进行任何交叉检查。

      在实现方面,此方法的行为如下。解析阶段的结果可以被认为是字段到值的映射。此方法的行为是导致该map在阶段 1 和阶段 2 之间进行过滤,删除除指定为此方法的参数的字段之外的所有字段。

      此实例是不可变的,不受此方法调用的影响。

      参数:
      resolverFields - 新的解析器字段集,如果没有字段则为 null
      返回:
      基于此格式化程序的格式化程序,具有请求的解析器样式,不为空
    • withResolverFields

      public DateTimeFormatter  withResolverFields(Set <TemporalField > resolverFields)
      使用一组新的解析器字段返回此格式化程序的副本。

      这将返回一个与此格式化程序状态相似但设置了解析器字段的格式化程序。默认情况下,格式化程序没有解析器字段。

      更改解析器字段仅在解析期间有效。解析文本字符串分两个阶段进行。阶段 1 是根据添加到构建器的字段进行基本文本解析。阶段 2 将解析的字段值对解析为日期和/或时间对象。解析器字段用于过滤阶段 1 和阶段 2 之间的字段值对。

      这可用于在两种或多种解决日期或时间的方式之间进行选择。例如,如果格式化程序由年、月、月中日和年中日组成,那么有两种方法可以解析日期。使用参数 YEAR DAY_OF_YEAR 调用此方法将确保使用年份和年份解析日期,这实际上意味着在解析阶段忽略月份和日期。

      以类似的方式,此方法可用于忽略否则会被交叉检查的辅助字段。例如,如果格式化程序由年、月、月中日和星期几组成,那么只有一种方法可以解析日期,但解析后的星期几值将被交叉检查反对解决的日期。使用参数 YEAR MONTH_OF_YEAR DAY_OF_MONTH 调用此方法将确保正确解析日期,但不会对星期几进行任何交叉检查。

      在实现方面,此方法的行为如下。解析阶段的结果可以被认为是字段到值的映射。此方法的行为是导致该map在阶段 1 和阶段 2 之间进行过滤,删除除指定为此方法的参数的字段之外的所有字段。

      此实例是不可变的,不受此方法调用的影响。

      参数:
      resolverFields - 新的解析器字段集,如果没有字段则为 null
      返回:
      基于此格式化程序的格式化程序,具有请求的解析器样式,不为空
    • format

      public String  format(TemporalAccessor  temporal)
      使用此格式化程序格式化日期时间对象。

      这使用格式化程序的规则将日期时间格式化为字符串。

      参数:
      temporal - 要格式化的时间对象,不为空
      返回:
      格式化的字符串,不为空
      抛出:
      DateTimeException - 如果在格式化过程中发生错误
    • formatTo

      public void formatTo(TemporalAccessor  temporal, Appendable  appendable)
      使用此格式化程序将日期时间对象格式化为 Appendable

      这会将格式化的日期时间输出到指定的目的地。 Appendable 是一个通用接口,由所有关键字符输出类实现,包括 StringBufferStringBuilderPrintStreamWriter

      尽管 Appendable 方法会抛出 IOException ,但此方法不会。相反,任何 IOException 都包含在运行时异常中。

      参数:
      temporal - 要格式化的时间对象,不为空
      appendable - 可追加格式,不为空
      抛出:
      DateTimeException - 如果在格式化过程中发生错误
    • parse

      public TemporalAccessor  parse(CharSequence  text)
      完全解析生成时间对象的文本。

      这会解析整个文本,生成一个时间对象。使用 parse(CharSequence, TemporalQuery) 通常更有用。此方法的结果是 TemporalAccessor 已解决,应用基本验证检查以帮助确保有效的日期时间。

      如果解析在没有读取整个文本长度的情况下完成,或者在解析或合并过程中出现问题,则会抛出异常。

      参数:
      text - 要解析的文本,不为空
      返回:
      解析的时间对象,不为空
      抛出:
      DateTimeParseException - 如果无法解析请求的结果
    • parse

      public TemporalAccessor  parse(CharSequence  text, ParsePosition  position)
      使用此格式化程序解析文本,提供对文本位置的控制。

      这会解析文本,而不需要解析从字符串的开头开始或在结尾结束。此方法的结果是 TemporalAccessor 已解决,应用基本验证检查以帮助确保有效的日期时间。

      将从指定的开始 ParsePosition 开始解析文本。不必解析整个文本长度,ParsePosition 将在解析结束时用索引更新。

      此方法的操作与在 java.text.Format 上使用 ParsePosition 的类似方法略有不同。该类将使用 ParsePosition 上的错误索引返回错误。相比之下,如果发生错误,此方法将抛出 DateTimeParseException ,异常包含错误索引。由于此 API 中解析和解析日期/时间的复杂性增加,这种行为更改是必要的。

      如果格式化程序使用不同的值多次解析同一个字段,结果将是错误的。

      参数:
      text - 要解析的文本,不为空
      position - 解析的位置,用解析的长度和任何错误的索引更新,不为空
      返回:
      解析的时间对象,不为空
      抛出:
      DateTimeParseException - 如果无法解析请求的结果
      IndexOutOfBoundsException - 如果位置无效
    • parse

      public <T> T parse(CharSequence  text, TemporalQuery <T> query)
      完全解析生成指定类型对象的文本。

      大多数应用程序应该使用这种方法进行解析。它解析整个文本以生成所需的日期时间。查询通常是对 from(TemporalAccessor) 方法的方法引用。例如:

       LocalDateTime dt = parser.parse(str, LocalDateTime::from);
       
      如果在没有读取整个文本长度的情况下完成解析,或者在解析或合并过程中出现问题,则会抛出异常。
      类型参数:
      T - 解析日期时间的类型
      参数:
      text - 要解析的文本,不为空
      query - 定义要解析的类型的查询,不为空
      返回:
      解析的日期时间,不为空
      抛出:
      DateTimeParseException - 如果无法解析请求的结果
    • parseBest

      public TemporalAccessor  parseBest(CharSequence  text, TemporalQuery <?>... queries)
      完全解析生成指定类型之一的对象的文本。

      当解析器可以处理可选元素时,使用此解析方法很方便。例如,“uuuu-MM-dd HH.mm[VV]”的模式可以完全解析为 ZonedDateTime ,或部分解析为 LocalDateTime 。查询必须按顺序指定,从最匹配的全解析选项开始,到最差匹配的最小解析选项结束。查询通常是对 from(TemporalAccessor) 方法的方法引用。

      结果与成功解析的第一个类型相关联。通常,应用程序将使用instanceof 来检查结果。例如:

       TemporalAccessor dt = parser.parseBest(str, ZonedDateTime::from, LocalDateTime::from);
       if (dt instanceof ZonedDateTime) {
        ...
       } else {
        ...
       }
       
      如果在没有读取整个文本长度的情况下完成解析,或者在解析或合并过程中出现问题,则会抛出异常。
      参数:
      text - 要解析的文本,不为空
      queries - 定义要尝试解析的类型的查询必须实现 TemporalAccessor,而不是 null
      返回:
      解析的日期时间,不为空
      抛出:
      IllegalArgumentException - 如果指定的类型少于 2 种
      DateTimeParseException - 如果无法解析请求的结果
    • parseUnresolved

      public TemporalAccessor  parseUnresolved(CharSequence  text, ParsePosition  position)
      使用此格式化程序解析文本,而不解析结果,用于高级用例。

      解析是作为一个两阶段操作来实现的。首先,使用格式化程序定义的布局解析文本,生成 Map 字段值、ZoneIdChronology 。其次,解析后的数据是resolved,通过验证、组合和简化各种字段成为更有用的字段。此方法执行解析阶段但不执行解析阶段。

      此方法的结果是 TemporalAccessor,表示输入中看到的数据。值未经过验证,因此解析日期字符串“2012-00-65”将导致包含三个字段的时间 - 年份“2012”、月份“0”和日期“65”。

      将从指定的开始 ParsePosition 开始解析文本。不必解析整个文本长度,ParsePosition 将在解析结束时用索引更新。

      使用 ParsePosition 而不是 DateTimeParseException 的错误索引字段返回错误。返回的错误索引将被设置为指示错误的索引。调用者必须在使用结果之前检查错误。

      如果格式化程序使用不同的值多次解析同一个字段,结果将是错误的。

      此方法适用于需要在解析期间访问内部状态的高级用例。典型的应用程序代码应该使用 parse(CharSequence, TemporalQuery) 或目标类型的解析方法。

      参数:
      text - 要解析的文本,不为空
      position - 解析的位置,用解析的长度和任何错误的索引更新,不为空
      返回:
      已解析的文本,如果解析导致错误则为 null
      抛出:
      DateTimeException - 如果在解析过程中出现问题
      IndexOutOfBoundsException - 如果位置无效
    • toFormat

      public Format  toFormat()
      将此格式化程序作为 java.text.Format 实例返回。

      返回的 Format 实例将格式化任何 TemporalAccessor 并解析为已解析的 TemporalAccessor

      异常将遵循 Format 的定义,有关格式化期间的 IllegalArgumentException 和解析期间的 ParseException 或 null 的详细信息,请参阅这些方法。该格式不支持返回格式字符串的属性。

      返回:
      此格式化程序作为经典格式实例,不为空
    • toFormat

      public Format  toFormat(TemporalQuery <?> parseQuery)
      将此格式化程序作为 java.text.Format 实例返回,该实例将使用指定的查询进行解析。

      返回的 Format 实例将格式化任何 TemporalAccessor 并解析为指定的类型。该类型必须是 parse(java.lang.CharSequence) 支持的类型。

      异常将遵循 Format 的定义,有关格式化期间的 IllegalArgumentException 和解析期间的 ParseException 或 null 的详细信息,请参阅这些方法。该格式不支持返回格式字符串的属性。

      参数:
      parseQuery - 定义要解析的类型的查询,不为空
      返回:
      此格式化程序作为经典格式实例,不为空
    • toString

      public String  toString()
      返回底层格式化程序的描述。
      重写:
      toString 在类 Object
      返回:
      此格式化程序的描述,不为空