Module java.base
Package java.time.format

Class 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方法返回一个覆盖区域设置的新格式化程序。区域设置会影响格式化和解析的某些方面。例如,ofLocalizedDate提供了使用特定区域设置的日期格式化程序。

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

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

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

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

预定义格式化程序

预定义格式化程序
格式化程序 描述 示例
ofLocalizedDate(dateStyle) 具有来自区域设置的日期样式的格式化程序 '2011-12-03'
ofLocalizedTime(timeStyle) 具有来自区域设置的时间样式的格式化程序 '10:15:30'
ofLocalizedDateTime(dateTimeStyle) 具有来自区域设置的日期和时间样式的格式化程序 '3 Jun 2008 11:05:30'
ofLocalizedDateTime(dateStyle,timeStyle) 具有来自区域设置的日期和时间样式的格式化程序 '3 Jun 2008 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[Europe/Paris]'
ISO_DATE_TIME 带ZoneId的日期和时间 '2011-12-03T10:15:30+01:00[Europe/Paris]'
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 'Tue, 3 Jun 2008 11:05:30 GMT'

格式化和解析的模式

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

例如:

  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 纪元 文本 公元; Anno Domini; A
u 2004; 04
y 纪元内年份 2004; 04
D 年内天数 数字 189
M/L 年内月份 数字/文本 7; 07; 七月; 七月; J
d 月内天数 数字 10
g 修正儒略日 数字 2451334
Q/q 年内季度 数字/文本 3; 03; Q3; 第三季度
Y 基于周的年份 1996; 96
w 基于周的年内周数 数字 27
W 月内周数 数字 4
E 星期几 文本 周二; 星期二; T
e/c 本地化星期几 数字/文本 2; 02; 周二; 星期二; T
F 对齐的月内周数 数字 3
a 上午/下午 文本 下午
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 时区 ID 区域 ID 美国/洛杉矶; Z; -08:30
v 通用时区名称 区域名称 太平洋时间; PT
z 时区名称 区域名称 太平洋标准时间; PST
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 下一个填充 填充修饰符 1
' 文本转义 定界符
'' 单引号 文字 '
[ 可选部分开始
] 可选部分结束
# 保留供将来使用
{ 保留供将来使用
} 保留供将来使用

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

文本:文本样式基于使用的模式字母数量确定。少于4个模式字母将使用简短形式。正好有4个模式字母将使用完整形式。正好有5个模式字母将使用紧凑形式。模式字母'L'、'c'和'q'指定文本样式的独立形式。

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

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

小数:将纳秒字段输出为秒的小数部分。纳秒值有九位数字,因此模式字母的数量为1到9。如果小于9,则纳秒值将被截断,只输出最重要的数字。

年份:字母的数量确定了最小字段宽度,低于该宽度将使用填充。如果字母的数量为两,则使用缩减两位数字形式。对于打印,这将输出最右边的两位数字。对于解析,这将使用基值2000,导致年份在2000年至2099年范围内。如果字母的数量少于四(但不是两),则仅对负年份输出符号,如SignStyle.NORMAL。否则,如果超出填充宽度,则输出符号,如SignStyle.EXCEEDS_PAD

区域 ID:这将输出时区 ID,例如'欧洲/巴黎'。如果字母的数量为两,则输出时区 ID。其他任何数量的字母都会抛出IllegalArgumentException

时区名称:这将输出时区 ID 的显示名称。如果模式字母为'z',则输出考虑夏令时的区域名称。如果没有足够的信息确定是否应用夏令时,则将使用忽略夏令时的名称。如果字母的数量为一、二或三,则输出短名称。如果字母的数量为四,则输出完整名称。五个或更多字母会抛出IllegalArgumentException

如果模式字母为'v',则输出忽略夏令时的区域名称。如果字母的数量为一,则输出短名称。如果字母的数量为四,则输出完整名称。两个、三个和五个或更多字母会抛出IllegalArgumentException

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

偏移 O:对于非零偏移,根据模式字母的数量格式化本地化偏移。一个字母输出本地化偏移的简短形式,即本地化偏移文本,例如'GMT',带有不带前导零的小时、可选的2位分钟和秒(如果非零),以及冒号,例如'GMT+8'。四个字母输出完整形式,即本地化偏移文本,例如'GMT,带有2位小时和分钟字段,如果非零则带有可选的秒字段,例如'GMT+08:00'。如果偏移为零,则仅输出本地化文本。其他任何数量的字母都会抛出IllegalArgumentException

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

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

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

例如,'ppH'将输出左侧填充空

此类提供了五种解析方法。其中四种执行解析和解析阶段。第五种方法,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版本起:
1.8
  • Field Details

    • ISO_LOCAL_DATE

      public static final DateTimeFormatter ISO_LOCAL_DATE
      用于格式化或解析不带偏移的日期的ISO日期格式化程序,例如'2011-12-03'。

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

      • 四位或更多位的年份。范围在0000到9999年的年份将被前置零以确保四位数。超出该范围的年份将具有前缀的正负符号。
      • 一个连字符('HYPHEN-MINUS',U+002D)
      • 两位月份。这将被前置零以确保两位数。
      • 一个连字符('HYPHEN-MINUS',U+002D)
      • 两位日期。这将被前置零以确保两位数。

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

    • ISO_OFFSET_DATE

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

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

      • ISO_LOCAL_DATE
      • 偏移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
      • 如果偏移不可用,则格式完整。
      • 偏移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扩展本地时间格式。该格式包括:

      • 两位小时。这将被前置零以确保两位数。
      • 一个冒号
      • 两位分钟。这将被前置零以确保两位数。
      • 如果不可用秒,则格式完整。
      • 一个冒号
      • 两位。这将被前置零以确保两位数。
      • 如果纳秒为零或不可用,则格式完整。
      • 一个小数点
      • 一到九位纳秒。将输出所需的位数。

      返回的格式化程序没有覆盖年表或区域。它使用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
      • 偏移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
      • 如果偏移不可用,则格式完整。
      • 偏移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
      • 偏移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,则格式完成。
      • 一个开方括号'['。
      • 区域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[Europe/Paris]'。

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

      • ISO_LOCAL_DATE_TIME
      • 如果偏移不可用于格式化或解析,则格式完成。
      • 偏移ID。如果偏移有秒,则会处理,尽管这不是ISO-8601标准的一部分。
      • 如果区域ID不可用或是ZoneOffset,则格式完成。
      • 一个开方括号'['。
      • 区域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扩展序数日期格式。格式包括:

      • 的四位数或更多。范围在0000到9999年之间的年份将被前置零以确保四位数。超出该范围的年份将具有前缀的正负符号。
      • 连字符('HYPHEN-MINUS',U+002D)
      • 年的第几天的三位数。这将被前置零以确保三位数。
      • 如果偏移不可用于格式化或解析,则格式完成。
      • 偏移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扩展基于周的日期格式。格式包括:

      • 基于周的年份的四位数或更多。范围在0000到9999年之间的年份将被前置零以确保四位数。超出该范围的年份将具有前缀的正负符号。
      • 连字符('HYPHEN-MINUS',U+002D)
      • 字母'W'。解析不区分大小写。
      • 基于周的年份的周的两位数。这将被前置零以确保三位数。
      • 连字符('HYPHEN-MINUS',U+002D)
      • 星期几的一位数。值从星期一(1)到星期日(7)。
      • 如果偏移不可用于格式化或解析,则格式完成。
      • 偏移ID。如果偏移有秒,则会处理,尽管这不是ISO-8601标准的一部分。解析不区分大小写。

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

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

    • ISO_INSTANT

      public static final DateTimeFormatter ISO_INSTANT
      ISO即时格式化程序,用于格式化或解析UTC中的即时时间,例如'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基本本地日期格式。格式包括:

      • 的四位数。仅支持0000到9999年的年份。
      • 月份的两位数。这将被前置零以确保两位数。
      • 日期的两位数。这将被前置零以确保两位数。
      • 如果偏移不可用于格式化或解析,则格式完成。
      • 偏移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日期时间格式化程序,例如'Tue, 3 Jun 2008 11:05:30 GMT'。

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

      格式包括:

      • 如果星期几不可用于格式化或解析,则跳到日期。
      • 用英语表示的三个字母星期几
      • 逗号
      • 空格
      • 一个或两位数字表示日期
      • 空格
      • 用英语表示的三个字母月份
      • 空格
      • 四位数字表示年份。仅支持0000年到9999年的年份。
      • 空格
      • 两位数字表示小时。这会在前面补零以确保两位数字。
      • 冒号
      • 两位数字表示分钟。这会在前面补零以确保两位数字。
      • 如果秒数不可用,则跳到下一个空格。
      • 冒号
      • 两位数字表示。这会在前面补零以确保两位数字。
      • 空格
      • 没有冒号或秒数的偏移ID。零偏移使用"GMT"。不处理北美时区名称和军事时区名称。

      解析不区分大小写。

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

  • Method Details

    • ofPattern

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

      此方法将基于类文档中描述的简单字母和符号模式创建一个格式化程序。例如,d MMM uuuu将2011-12-03格式化为'3 Dec 2011'。

      格式化程序将使用默认格式区域。可以使用返回的格式化程序上的withLocale(Locale)来更改这个。或者使用此方法的ofPattern(String, Locale)变体。

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

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

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

      此方法将基于类文档中描述的简单字母和符号模式创建一个格式化程序。例如,d MMM uuuu将2011-12-03格式化为'3 Dec 2011'。

      格式化程序将使用指定的区域设置。可以使用返回的格式化程序上的withLocale(Locale)来更改这个。

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

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

      public static DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle)
      返回ISO年表的特定区域设置日期格式。

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

      区域设置是从格式化程序确定的。此方法直接返回的格式化程序将使用默认格式区域。可以使用此方法的结果上的withLocale(Locale)来控制区域设置。

      请注意,本地化模式是延迟查找的。这个DateTimeFormatter保存所需的样式和区域设置,根据需要查找所需的模式。

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

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

      public static DateTimeFormatter ofLocalizedTime(FormatStyle timeStyle)
      返回ISO年表的特定区域设置时间格式。

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

      区域设置是从格式化程序确定的。此方法直接返回的格式化程序将使用默认格式区域。可以使用此方法的结果上的withLocale(Locale)来控制区域设置。

      请注意,本地化模式是延迟查找的。这个DateTimeFormatter保存所需的样式和区域设置,根据需要查找所需的模式。

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

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

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

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

      区域设置是从格式化程序确定的。此方法直接返回的格式化程序将使用默认格式区域。可以使用此方法的结果上的withLocale(Locale)来控制区域设置。

      请注意,本地化模式是延迟查找的。这个DateTimeFormatter保存所需的样式和区域设置,根据需要查找所需的模式。

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

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

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

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

      区域设置是从格式化程序确定的。此方法直接返回的格式化程序将使用默认格式区域。可以使用此方法的结果上的withLocale(Locale)来控制区域设置。

      请注意,本地化模式是延迟查找的。这个DateTimeFormatter保存所需的样式和区域设置,根据需要查找所需的模式。

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

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

      public static DateTimeFormatter ofLocalizedPattern(String requestedTemplate)
      创建一个从ISO年表请求模板派生的区域特定格式化程序。请求的模板是一个典型模式符号的系列,按照从最大日期或时间单位到最小日期或时间单位的规范顺序排列,可以用以下正则表达式表示:
           "G{0,5}" +        // 时代
           "y*" +            // 年
           "Q{0,5}" +        // 季度
           "M{0,5}" +        // 月
           "w*" +            // 基于年的周的周
           "E{0,5}" +        // 星期几
           "d{0,2}" +        // 月份中的日期
           "B{0,5}" +        // 白天的时段/上午下午
           "[hHjC]{0,2}" +   // 一天中的小时/上午下午(参考LDML的'j'和'C')
           "m{0,2}" +        // 小时中的分钟
           "s{0,2}" +        // 分钟中的秒
           "[vz]{0,4}"       // 时区
      
      所有模式符号都是可选的,每个模式符号代表一个字段,例如,'M'代表月份字段。模式符号的字母数量遵循与“数字”或“文本”相同的表示,如“数字”或“文本”在格式化和解析的模式部分中所述。请求模板中的其他模式符号是无效的。

      请求模板与可用本地化格式中最接近的映射由Unicode LDML规范定义。例如,从请求模板yMMM创建的格式化程序将在US区域中将日期'2020-06-16'格式化为'Jun 2020'。

      区域设置由格式化程序确定。此方法直接返回的格式化程序使用默认FORMAT区域设置。可以使用此方法的结果上的withLocale(Locale)来控制区域设置。

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

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

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

      这返回一个提供从解析中获取额外信息的单例查询。该查询始终返回一个非空期间,如果为null,则返回零期间。

      有两种情况下,此查询可能返回非零期间。

      • 如果ResolverStyleLENIENT,并且解析时间时没有日期,则解析的完整结果包括一个LocalTime和多余的Period天数。
      • 如果ResolverStyleSMART,并且解析时间时没有日期,其中时间为24:00:00,则解析的完整结果包括00:00:00的LocalTime和一天的多余Period

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

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

        要解析的文本        解析的对象                         多余天数
        "2012-12-03T00:00"   LocalDateTime.of(2012, 12, 3, 0, 0)   零
        "2012-12-03T24:00"   LocalDateTime.of(2012, 12, 4, 0, 0)   零
        "00:00"              LocalTime.of(0, 0)                    零
        "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()
      提供对是否解析了闰秒的查询。

      这返回一个提供从解析中获取额外信息的单例查询。该查询始终返回一个非空布尔值,如果解析看到闰秒则返回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())) {
          // 验证闰秒是否正确,并应用正确的平滑
        }
       
      返回:
      一个查询,提供对是否解析了闰秒的访问
    • getLocale

      public Locale getLocale()
      获取在格式化期间使用的区域设置。

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

      返回:
      此格式化程序的区域设置,不能为空
    • withLocale

      public DateTimeFormatter withLocale(Locale locale)
      返回具有新区域设置的此格式化程序的副本。

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

      区域设置按传入的方式存储,不进行进一步处理。如果区域设置具有Unicode扩展,则稍后可能在文本处理中使用。要从Unicode扩展设置年表、时区和小数样式,请参见localizedBy()

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

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

      public DateTimeFormatter localizedBy(Locale locale)
      返回具有区域设置、日历、区域、小数样式和/或时区的本地化值的此格式化程序的副本,这些值优先于此格式化程序中的值。

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

      withLocale方法不同,调用此方法可能会根据与其他withXXXX()方法链接的方法的顺序产生不同的格式化程序。

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

      参数:
      locale - 区域设置,不能为空
      返回:
      基于此格式化程序的具有本地化值的日历、小数样式和/或时区的格式化程序,这些值优先于此格式化程序中的值。
      自:
      10
      参见:
    • getDecimalStyle

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

      public DateTimeFormatter withDecimalStyle(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
      返回:
      基于此格式化程序的具有请求的覆盖年表的格式化程序,不为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
      返回:
      基于此格式化程序的具有请求的覆盖区域的格式化程序,不为null
    • getResolverStyle

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

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

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

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

      返回具有与此格式化程序类似状态的格式化程序,但设置了解析样式。默认情况下,格式化程序具有SMART解析样式。

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

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

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

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

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

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

      public DateTimeFormatter withResolverFields(TemporalField... resolverFields)
      返回具有新解析字段集的此格式化程序的副本。

      返回具有与此格式化程序类似状态的格式化程序,但设置了解析字段。默认情况下,格式化程序没有解析字段。

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

      这可用于选择日期或时间可能解析的两种或更多种方式。例如,如果格式化程序包括年、月、日和年日,则有两种解析日期的方式。使用参数YEARDAY_OF_YEAR调用此方法将确保使用年和年日解析日期,有效地意味着在解析阶段忽略月和日。

      类似地,此方法可用于忽略否则将进行交叉检查的次要字段。例如,如果格式化程序包括年、月、日和星期几,则只有一种解析日期的方式,但星期几的解析值将与解析的日期进行交叉检查。使用参数YEARMONTH_OF_YEARDAY_OF_MONTH调用此方法将确保正确解析日期,但不进行星期几的任何交叉检查。

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

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

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

      public DateTimeFormatter withResolverFields(Set<TemporalField> resolverFields)
      返回具有新解析字段集的此格式化程序的副本。

      返回具有与此格式化程序类似状态的格式化程序,但设置了解析字段。默认情况下,格式化程序没有解析字段。

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

      这可用于选择日期或时间可能解析的两种或更多种方式。例如,如果格式化程序包括年、月、日和年日,则有两种解析日期的方式。使用参数YEARDAY_OF_YEAR调用此方法将确保使用年和年日解析日期,有效地意味着在解析阶段忽略月和日。

      类似地,此方法可用于忽略否则将进行交叉检查的次要字段。例如,如果格式化程序包括年、月、日和星期几,则只有一种解析日期的方式,但星期几的解析值将与解析的日期进行交叉检查。使用参数YEARMONTH_OF_YEARDAY_OF_MONTH调用此方法将确保正确解析日期,但不进行星期几的任何交叉检查。

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

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

      参数:
      resolverFields - 新解析字段集,如果没有字段则为null
      返回:
      基于此格式化程序的具有请求的解析样式的格式化程序,不为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,不能为空
      返回:
      解析后的日期时间,不能为空
      抛出:
      IllegalArgumentException - 如果指定的类型少于2个
      DateTimeParseException - 如果无法解析请求的结果
    • parseUnresolved

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

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

      此方法的结果是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
      返回:
      此格式化程序的描述,不为null