转换为数据对象时,莫斯科时间落后一小时

问题描述

在我的应用程序中,在转换为日期对象时,我总是比时间晚一小时。这个问题只发生在莫斯科时区。 下面是代码

    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

解决方案包括:

  1. 升级到具有最新时区数据库的较新版本的 Joda-Time。
  2. 根据您仅与较新的捆绑时区数据库一起使用的版本的源构建您的 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。

可能的解决方案包括:

  1. 升级到具有最新时区数据的较新 Java 版本。
  2. 通过仅升级其时区数据库来修复您当前的 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 或其他时间.在这种情况下,我相信您的代码会抛出一个令人惊讶的异常。此外,我发现将单个字段设置为低级别,并且更喜欢在一个方法调用中设置所有内容,即使它需要进一步的操作来确定要传递给该方法的参数。

链接

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...