gpt4 book ai didi

java - 如何获取带偏移量和不带偏移量的日期时间?

转载 作者:行者123 更新时间:2023-12-01 16:42:58 26 4
gpt4 key购买 nike

目前我的方法能够解析和格式化带有偏移量的日期和时间。

当我体验 JUnit 时,我发现了一个错误——对于很多人来说这是非常明显的——我只能在它包含偏移量时才能解析它。

我要么得到无法从 TemporalAccessor 获取 OffsetDateTime 或者我无法使用偏移量解析时间。

这是我到目前为止的代码:

工作输入: “2020-01-12T10:30-06:00”

输入无效:“2020-01-12T10:30”

OffsetDateTime offsetDateTime = OffsetDateTime.parse(date, buildIso8601Formatter());
Instant instant = offsetDateTime.toInstant();

return LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

它适用于带有偏移量的日期时间,但反之则不然。

最后,我希望能够以相同的方法解析带/不带偏移量的日期时间。

最佳答案

时刻

Working input: "2020-01-12T10:30-06:00"

Not working input: "2020-01-12T10:30"

这些输入是两种非常不同的动物。第一个代表一个时刻,第二个则不代表一个时刻。第一个确定时间轴上的特定点,第二个则没有。

第二个缺少时区或与 UTC 的偏移量的关键上下文。因此,我们不知道第二个输入是否代表日本东京 12 日的 10:30,或者突尼斯突尼斯的 10:30,或者美国俄亥俄州托莱多的 10:30——所有这些时刻都非常不同,相隔几个小时。

数据源错误

如果您的输入源任意省略了偏移量/区域信息,那么您自己的 Java 编程没有问题,而是您的数据源有问题。

想象一个提供一系列货币金额的数据源,其中一些金额指示加元、欧元或日元的货币,而另一些金额则任意省略任何货币指示。显然,这将被视为错误数据,应在源头修复。

如果您确实想处理这些错误数据,只需查找是否存在加号或减号即可。如果找到,则解析为 OffsetDateTime。如果省略,则解析为 LocalDateTime

if( input.contains( "+" ) || input.contains( "-" ) ) {
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
} else {
LocalDateTime ldt = LocalDateTime.parse( input ) ;
}

或者,尝试解析为一种类型。如果DateTimeParseException抛出,尝试其他类型。

如果您确定缺少偏移量的输入是针对特定区域或偏移量的,请应用该偏移量或区域。

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

如果您想在保持与 UTC 的偏移量的同时丢失时区,以匹配其他 OffsetDateTime 对象,请调用 toOffsetDateTime

OffsetDateTime odt = zdt.toOffsetDateTime() ;

仅供引用,time zone 之间的区别仅仅是offset ...偏移量只是比 UTC 早(正)或晚(负)几个小时、分钟、秒数,即 prime meridian 。时区的意义要大得多。时区是特定地区人民使用的偏移量的过去、现在和 future 变化的历史,由他们的政客设定(并且经常更改!)。

enter image description here

关于java - 如何获取带偏移量和不带偏移量的日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59737191/

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