gpt4 book ai didi

java.util.Date 和 jodaTime 时区

转载 作者:行者123 更新时间:2023-12-01 10:14:04 26 4
gpt4 key购买 nike

从 UI (jsf) 我得到一个 java.util.Date 对象(我们称之为a)。据我所知,这个没有任何时区信息。

然后,我使用这样的代码来执行一些业务逻辑:

Date bar = new DateTime(a).plusDays(1).toDate()

最后我将这个存储到我的数据库中

我想知道我是否会遇到一些时区问题?因为 JodaTime 使用来自服务器的时区信息?!

对于数据库,我使用@Temporal(TemporalType.*) 和我的 Oracle DB 数据类型 DATE

背景:我使用 JodaTime 来添加和减去天/小时/周,因为如果 API 很好的话

最佳答案

24 小时!= 1 天

您忽略了 Jon Skeet 的评论。你必须清醒地认识到这一事实:一天并不意味着 24 小时。由于夏令时 (DST) 等异常情况,一天的时间可能长于或短于 24 小时。

您需要明确您的情况需要哪一个期限,24 小时还是一天。

时区

对于添加 24 小时,时区无关紧要。

时区对于确定日期和日期至关重要。对于任何特定时刻,世界各地的日期都会有所不同。例如,巴黎新一天的黎明比蒙特利尔早。

此外,时区还定义了处理夏令时 (DST) 等异常情况的规则。

如果省略,则应用 JVM 当前的默认时区。这是有风险的,因为默认值可以在运行时的任何时刻通过该 JVM 中任何应用程序的任何线程中的任何代码调用 TimeZone.setDefault 进行更改。

我建议您始终通过传递可选参数来指定时区,而不是隐式依赖 JVM 当前的默认值。 区域设置也是如此。

java.time 取代 Joda-Time

Joda-Time 的创建者继续定义了 JSR 310,现在作为 Java 8 及更高版本中内置的 java.time 框架实现。虽然 Joda-Time 仍然得到积极支持,但制造商要求我们在方便时尽快迁移到 java.time。

将您的 java.util.Date 转换为 Instant,即 UTC 时间轴上的时刻。

Instant instant = myJavaUtilDate.toInstant();

添加 24 小时

添加 24 小时很简单。

Instant instantPlus24Hours = instant.plus( 24 , ChronoUnit.Hours );

添加 1 天

添加日期需要特定时区的上下文。根据定义,Instant 始终采用 UTC。因此我们需要应用时区来生成 ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime zdtDayLater = zdt.plusDays( 1 );

关于java.util.Date 和 jodaTime 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36010103/

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