如何解决转换为数据对象时,莫斯科时间落后一小时
在我的应用程序中,在转换为日期对象时,我总是比时间晚一小时。这个问题只发生在莫斯科时区。 下面是代码:
MutableDateTime mdt = new MutableDateTime(time);
mdt.setSecondOfMinute(0);
mdt.setMinuteOfDay(0);
mdt.toDate()
在上面的代码中 mdt.todate() 返回 5/30/2021 23:00 而不是 5/31/2021 00:00。
jdk 版本:“1.8.0_191”
解决方法
编辑:为什么转换 mdt.toDate()
后的“June 6 00:00”变成“May 31 23:00”?
您令人惊讶的观察结果可能来自带有旧时区数据库的旧 Joda-Time 版本,其中欧洲/莫斯科的偏移量为 +04:00 而不是 +03:00。那是在 2010 年 10 月 31 日到 2014 年 10 月 26 日之间。如果 Joda-Time“相信”情况仍然如此,它会将您的 MutableDateTime
设置为类似 2021-06-01T00:00:00.000+04:00
的内容,偏移量为 +04:00 而不是 + 03:00。这对应于 2021-05-31T20:00Z
UTC,其中正确的时间点应该是 2021-05-31T21:00Z
UTC。换句话说,这还早了一个小时。因此,您得到的 Date
也早了一个小时。您的 Java 1.8“知道”莫斯科最近在 +03:00 偏移,因此将时间打印为 Mon May 31 23:00:00 MSK 2021
。
解决方案包括:
- 升级到具有最新时区数据库的较新版本的 Joda-Time。
- 根据您仅与较新的捆绑时区数据库一起使用的版本的源构建您的 Joda-Time。这在 Joda-Time 主页上有解释,请参阅下面的第二个链接。
原答案
您令人惊讶的观察结果可能来自带有旧时区数据库的旧 Java 版本,其中欧洲/莫斯科的偏移量为 +04:00 而不是 +03:00。那是在 2010 年 10 月 31 日至 2014 年 10 月 26 日之间。我在我的 Java 1.7.0_67 上复制了您的结果,并验证了我的 Java 安装“相信”莫斯科的偏移量为 +04:00 并且不使用夏令时 (DST),与上述时期的情况一样。
您的 Joda-Time 似乎足够新,可以知道 Europe/Moscow 是在 +03:00,因此在相关日期的 00:00 正确将您的 MutableDateTime
转换为 Date
.仅当您打印此 Date
时,Java 才使用其默认时区,仍然是欧洲/莫斯科,但使用自己的时区数据,因此将时间错误地打印为 01:00 而非 00:00。
可能的解决方案包括:
- 升级到具有最新时区数据的较新 Java 版本。
- 通过仅升级其时区数据库来修复您当前的 Java 安装。请参阅下面第二个链接中的时区更新器工具。
将时间设置为一天的开始
编辑:您添加了:
这里MutableDateTime time =new MutableDateTime(new Date().getTime());
要使用 Joda-Time 获取表示今天日期开始的 Date
:
Date oldfashionedDateObject = LocalDate.now(DateTimeZone.getDefault()).toDate();
System.out.println(oldfashionedDateObject);
刚刚输出:
MSK 2021 年 5 月 31 日星期一 00:00:00
原话:顺便说一句,将时间设置为一天开始的更简单、更安全的方法是:
mdt = mdt.toDateTime().withTimeAtStartOfDay().toMutableDateTime();
如果您需要保留相同的 MutableDateTime
对象,请改为:
mdt.setMillis(mdt.toDateTime().withTimeAtStartOfDay().toInstant());
首先,我会担心您的代码可能会在某个时区中运行,并且在该时区中的某一天在 00:00 发生转换,因此当天的第一个时刻是 01:00 或其他时间.在这种情况下,我相信您的代码会抛出一个令人惊讶的异常。此外,我发现将单个字段设置为低级别,并且更喜欢在一个方法调用中设置所有内容,即使它需要进一步的操作来确定要传递给该方法的参数。
链接
- Time Zone in Moscow,Russia (Moskva)。
- Joda-Time Updating the time zone data。
- Timezone Updater Tool 在 Oracle 网站上。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。