从UI (jsf)中,我获得了一个java.util.Date对象(让我们称其为a)。据我所知,这个没有任何时区信息。
然后,我使用这样的代码来执行一些业务逻辑:
Date bar = new DateTime(a).plusDays(1).toDate()最后,我将这个bar存储到数据库中
我想知道我会不会遇到一些时区问题?因为JodaTime使用来自服务器的时区信息?!
对于数据库,我在我的Oracle DB数据类型DATE上使用@Temporal(TemporalType.*)。
背景:我使用JodaTime来增加和减少天/小时/周,因为如果很好的API
发布于 2016-03-16 00:47:55
24小时=1天
你忽略了Jon Skeet的评论。你必须意识到一个事实,一天并不意味着24小时。由于夏令时(DST)等异常情况,一天的运行时间可能长于或短于24小时。
你需要清楚你的情况需要哪一段时间,24小时还是一天。
时区
对于增加的24小时,时区无关紧要。
在确定日期和日期时,时区至关重要。对于任何给定的时刻,日期在世界各地都是不同的。例如,巴黎的新一天比蒙特雷亚尔更早破晓。
此外,时区定义了处理异常情况的规则,例如夏令时(DST)。
如果省略此参数,则应用JVM的当前默认时区。这是有风险的,因为缺省值可能会在运行时的任何时刻被调用TimeZone.setDefault的JVM中任何应用程序的任何线程中的任何代码更改。
我建议您总是通过传递可选参数来指定时区,而不是隐式地依赖于JVM的当前默认值。Locale也是如此。
java.time取代Joda-Time
Joda-Time的制作者继续定义JSR310,JSR310现在被实现为Java8和更高版本中内置的java.time框架。虽然Joda-Time仍然受到积极支持,但制造商已经要求我们在方便的情况下尽快迁移到java.time。
将您的java.util.Date转换为Instant,即时间线上的时刻。
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 );发布于 2016-03-15 19:54:03
您的日期将存储在您的本地时区,但在数据库中没有关于时区的信息(假设您不手动处理)。
发布于 2016-03-15 19:54:15
如果你想使用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);对于时区相关的问题,您可以查看
https://stackoverflow.com/questions/36010103
复制相似问题