【发布时间】:2021-01-27 16:54:06
【问题描述】:
当我将它转换为莫斯科时区时,有人可以解释为什么过去的日期增加了一小时吗?
我使用的是 JDK 1.6.0_12 版本。
。2011-04-02T11:39:46+0300 --> Sat Apr 02 12:39:46 MSK 2011 // 11:39 --> 12:39
我当前的系统时区是“欧洲/莫斯科”UTC+3。
另外请注意,过去的日期是在 DST(夏令时)时区时间 UTC+4 中,早在俄罗斯使用。 2014 年 10 月,俄罗斯时区定义发生了立法变化。从那时起,俄罗斯全年使用 UTC+3。
我已经检查过了 this old post of 2014 .
但我认为这个问题看起来不同。我们的开发人员希望每个过去的日期(如 "2011-04-02T11:39:46+0300" 并且在 DST 期间)应该包含当前时区偏移值,即 +0300 ,而不是 +0400 。他们认为 JRE 将其错误地转换为 UTC+4 ,尽管“默认时区偏移”在此处显示 +3 。这种处理过去日期的时区偏移值的方式是否正确?
JRE 1.8 上给出了相同的输出,我认为这是一个更新版本,JRE 1.8 中的 TZ 定义应该没有任何问题。
提前致谢!
Java 代码:
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.Date;
public class HelloWorld{
public static void main(String []args)
{
String dateInString = "2011-04-02T11:39:46+0300";
System.out.println(dateInString);
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date date = dateFormat.parse(dateInString);
System.out.println(date);
} catch (Exception e) {
System.out.println(e);
}
final TimeZone tzone = TimeZone.getDefault();
System.out.println("Default Time Zone ID - " + tzone.getID());
System.out.println("Default Time Zone Offset - (" + (tzone.getRawOffset() / 60 / 60 / 1000) + ") hour.");
}
}
输出:
2011-04-02T11:39:46+0300
Sat Apr 02 12:39:46 MSK 2011
Default Time Zone ID - Europe/Moscow
Default Time Zone Offset - (3) hour.
【问题讨论】:
-
即使立法发生了变化;它们仅在应用之日后生效,因此对 UTC+3 的更改不应追溯应用于 2014 年之前的日期。
-
我建议你不要使用
SimpleDateFormat、TimeZone和Date。这些类设计不佳且早已过时,尤其是第一个类是出了名的麻烦。而是使用OffsetDateTime、ZonedDateTime、ZoneId和DateTimeFormatter,均来自java.time, the modern Java date and time API。 -
这是一个经过深思熟虑的好问题。您已经解释了您在搜索中找到的内容以及它如何没有解决您的问题,并且您提供了一个小而完整的代码示例。非常喜欢。
标签: java date datetime timezone simpledateformat