gpt4 book ai didi

datetime - Java 8 解析 ISO-8601 日期忽略时区的存在(或不存在)

转载 作者:行者123 更新时间:2023-12-03 06:24:35 29 4
gpt4 key购买 nike

我的应用程序应该能够解析日期而忽略时区(我总是确定它是 UTC)。问题是日期可能有以下两种形式 -

2017-09-11T12:44:07.793Z

0001-01-01T00:00:00

我可以使用 LocalDateTime 解析第一个,使用 Instant 类解析第二个。有没有办法使用单一机制来做到这一点?

附注我试图避免在输入字符串末尾硬编码 Z

最佳答案

如果Z偏移量是可选的,您可以使用 java.time.format.DateTimeFormatterBuilder带有可选部分:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// date/time
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
// optional offset
.optionalStart().appendOffsetId()
// create formatter
.toFormatter();

然后您可以使用parseBest方法,列表为TemporalQuery尝试创建对应的对象。然后检查返回类型并采取相应措施:

Instant instant = null;
// tries to create Instant, and if it fails, try a LocalDateTime
TemporalAccessor parsed = fmt.parseBest("2017-09-11T12:44:07.793Z", Instant::from, LocalDateTime::from);
if (parsed instanceof Instant) {
instant = (Instant) parsed;
} else if (parsed instanceof LocalDateTime) {
// convert LocalDateTime to UTC instant
instant = ((LocalDateTime) parsed).atOffset(ZoneOffset.UTC).toInstant();
}
System.out.println(instant); // 2017-09-11T12:44:07.793Z

使用第二个输入 ( 0001-01-01T00:00:00 ) 运行会生成 Instant相当于0001-01-01T00:00:00Z .

在上面的例子中,我只使用了 Instant::fromLocalDateTime::from ,因此格式化程序首先尝试创建一个 Instant 。如果不可能,那么它会尝试创建 LocalDateTime 。您可以向该列表添加任意数量的类型(例如,我可以添加 ZonedDateTime::from ,如果创建 ZonedDateTime ,我可以使用 Instant 方法转换为 toInstant() )。

<小时/>

正如您确定的那样,输入始终采用 UTC,您也可以直接在格式化程序中设置它:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// date/time
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
// optional offset
.optionalStart().appendOffsetId()
// create formatter with UTC
.toFormatter().withZone(ZoneOffset.UTC);

所以可以直接解析为Instant :

System.out.println(Instant.from(fmt.parse("2017-09-11T12:44:07.793Z"))); // 2017-09-11T12:44:07.793Z
System.out.println(Instant.from(fmt.parse("0001-01-01T00:00:00"))); // 0001-01-01T00:00:00Z

关于datetime - Java 8 解析 ISO-8601 日期忽略时区的存在(或不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46410624/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com