DateTimeFormatter

您所在的位置:网站首页 200013大写 DateTimeFormatter

DateTimeFormatter

2024-04-18 16:19| 来源: 网络整理| 查看: 265

用于打印和解析日期时间对象的格式化程序。

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

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

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”,则输出是夏令时感知区域名称。如果没有足够的信息来确定是否适用夏令时,将使用忽略夏令时的名称。如果字母数为一、二或三,则输出短名称。如果字母数为四个,则输出全名。五个或更多字母抛出 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 字段值、ZoneId 和 Chronology 。其次,解析后的数据是resolved,通过验证、组合和简化各种字段成为更有用的字段。

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

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

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

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

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

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3