在测试我的应用程序时,我遇到了一个奇怪的问题。当我输入 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
对于第一个,我得到的是 +0630
和 IDT
,而对于第二个,我得到的是 +0530
和预期的 IST
。
编辑:-
看了@Elliott Frisch 的回答后,我尝试了 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 会受到它的影响,如果这是一个已知问题,可能的解决方法是什么。
提前致谢。
最佳答案
这可能是 Java(而不是 JavaScript)的预期行为。
正如 RobG 的评论所暗示的那样以上,编程语言可能支持也可能不支持历史时间规则(例如 DST 和时区偏移)。在您的情况下,您的 Java 运行时似乎支持它,而您的 JavaScript 运行时不支持它。
可在 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 偏移量:1915 , 1943 , 1946
维基百科提供了更多关于 time in India 的信息:
Calcutta time was officially maintained as a separate time zone until 1948
Calcutta time可以指定为 UTC+5:54 或 UTC+5:53:20。后者与您的代码示例一致。
维基百科条目进一步指出,当前 IST 时区的偏移量为 UTC+5:30,直到 1955 年才在整个印度全面生效。
作为pointed out by Elliott Frisch并通过上面的 timeanddate.com 链接确认,DST 在二战期间有效。在您对他的回答的评论中,您声明:
is this the way we are supposed to save in database and use it in applications, or we use some workaround for it
我想这取决于。如果您确实需要准确地将日期区分为时间点,则需要与时区无关的表示形式,例如 UTC 或 unix 时间(或自 unix 纪元以来的毫秒数)。如果您只使用同一时区的本地日期,一个简单的字符串表示(例如 YYYY-MM-DD hh:mm:ss)就足够了。
关于javascript - Java Date 时区打印不同年份的不同时区,需要解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40815343/