Java 日期时区打印不同年份的不同时区,需要解决方法编辑:-

2022-09-02 12:41:33

在测试我的应用程序时,我遇到了一个奇怪的问题。当我把一个日期放在1945年之前的日期时,它会改变时区。

我有这个简单的程序来显示问题。

public static void main(String[] args) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
    Calendar calendar = Calendar.getInstance();

    System.out.println("**********Before 1945");
    calendar.set(1943, Calendar.APRIL, 12, 5, 34, 12);
    System.out.println(format.format(calendar.getTime()));
    System.out.println(calendar.getTime());

    System.out.println("**********After 1945");
    calendar.set(1946, Calendar.APRIL, 12, 5, 34, 12);
    System.out.println(format.format(calendar.getTime()));
    System.out.println(calendar.getTime());
}

我得到的输出如下:-

**********Before 1945
1943-04-12 05:34:12+0630
Mon Apr 12 05:34:12 IDT 1943

**********After 1945
1946-04-12 05:34:12+0530
Fri Apr 12 05:34:12 IST 1946

对于第一个,我将其作为和,而对于第二个,我得到的是预期的。+0630IDT+0530IST

编辑:-

在看了@Elliott弗里施的答案后,我尝试了1942年之前的日期:-

calendar.set(1915, Calendar.APRIL, 12, 5, 34, 12);
System.out.println(format.format(calendar.getTime()));
System.out.println(calendar.getTime());

输出:-

1915-04-12 05:34:12+0553
Mon Apr 12 05:34:12 IST 1915

在这里,它再次说,但显示.不应该是.IST+0553+0530

只是为了比较,我在javascript中尝试了同样的事情:-

new Date("1946-04-12 05:34:12") //prints Fri Apr 12 1946 05:34:12 GMT+0530 (IST)
new Date("1943-04-12 05:34:12") //prints Fri Apr 12 1943 05:34:12 GMT+0530 (IST)
new Date("1915-04-12 05:34:12") //prints Mon Apr 12 1915 05:34:12 GMT+0530 (IST)

这工作正常。我想知道为什么java会受到它的影响,如果这是一个已知的问题,那么可能的解决方法是什么

提前致谢。


答案 1

这可能是 Java(而不是 JavaScript)的预期行为。

正如 RobG 上面的注释所暗示的那样,编程语言可能支持也可能不支持历史时间规则(例如 DST 和时区偏移量)。在你的情况下,看起来你的Java运行时支持它,而你的JavaScript运行时不支持它。

有关印度的历史时区和 DST 规则的列表,请访问 timeanddate.com。该列表确认 Java 日期的时区偏移量:

  • 直到 1941 年:UTC+5:53:20
  • 1941 年:UTC+6:30
  • 1942 年:UTC+5:30
  • 1943-44 年:UTC+6:30
  • 从 1945 年开始:UTC+5:30

对照 Wolfram 检查您的日期|Alpha 进一步确认您的 Java 日期 UTC 偏移量:191519431946

维基百科提供了更多关于印度时间的信息:

加尔各答时间正式保持为一个单独的时区,直到1948年

加尔各答时间可以指定为 UTC+5:54 或 UTC+5:53:20。后者与您的代码示例一致。

维基百科条目进一步告知,当前偏移量为UTC + 5:30的IST时区直到1955年才在整个印度完全生效。

正如 Elliott Frisch 所指出的,并通过上面 timeanddate.com 的链接证实了这一点,DST 在第二次世界大战期间生效。在对他的回答的评论中,你说:

这是我们应该保存在数据库中并在应用程序中使用它的方式,还是我们使用一些解决方法

我想这要视情况而定。如果您确实需要准确地将日期区分为时间点,则需要一个与时区无关的表示形式,例如UTC或unix时间(或自Unix时代以来的毫秒)。如果您只使用来自同一时区的本地日期,则简单的字符串表示形式(例如 YYYY-MM-DD hh:mm:ss)就足够了。


答案 2

发生了一场战争。从维基百科链接来看,印度在1942年至1945年的第二次世界大战期间观察到了DST。