java.util.Date和jodaTime时区

时间:2016-03-15 11:31:02

标签: java date datetime jodatime

从UI(jsf)

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

之后,我使用这样的代码来做一些业务逻辑:

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

最后我将此bar存储到我的数据库

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

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

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

3 个答案:

答案 0 :(得分:2)

24小时!= 1天

你忽略了Jon Skeet的评论。你必须有意识地意识到有一天并不意味着24小时。由于夏令时(DST)等异常情况,一天可以运行更长或更短的24小时。

您需要明确您的情况需要哪个时段,24小时或一天。

时区

为了增加24小时,时区是无关紧要的。

时区对于确定日期和日期至关重要。对于任何特定时刻,日期在世界各地不同。例如,巴黎的新日早些时候比蒙特利尔早。

此外,时区定义了处理日光时间节省(DST)等异常的规则。

省略时,将应用JVM的当前默认时区。这是有风险的,因为该JVM调用TimeZone.setDefault中任何应用程序的任何线程中的任何代码都可以随时在运行时期间更改默认值。

我建议您始终通过传递可选参数来指定时区,而不是隐式依赖于JVM的当前默认值。同上Locale

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 );

答案 1 :(得分:0)

您的日期将存储在您当地的时区,但没有关于时区的数据库信息(假设您没有手动处理)。

答案 2 :(得分:-1)

如果要使用Joda-Time library,由于Date类的各种缺点。你可以做到

Date dt = new Date();
DateTime dateOriginal = new DateTime(dt);
DateTime datePlusOne = dateOriginal.plusDays(1);

更新:对于时区问题,您可以

LocalDateTime.from(dt.toInstant().atZone(ZoneId.of("UTC"))).plusDays(1);

对于与时区相关的问题,您可以查看

  1. Is java.sql.Timestamp timezone specific?