javascript - Java Date 时区打印不同年份的不同时区,需要解决方法

标签 javascript java date calendar timezone

在测试我的应用程序时,我遇到了一个奇怪的问题。当我输入 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,而对于第二个,我得到的是 +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/

相关文章:

javascript日期格式问题

r - 为什么在强制转换为字符时列表中的日期首先转换为数字

javascript - 我动态创建了一个复选框,希望在提交表单之前验证该复选框

javascript - 为什么这个 Javascript 代码块中需要 ()?

javascript - 有没有什么方法可以使用 Ajax 打印特定的 div

java - 如何让File类使用相对路径?

java - 按 MM/DD/YYYY 格式的日期对数组列表进行排序

javascript - 带有子项的数组 - 以父子层次结构的形式显示它

java - 在自定义 Alert Builder View 布局中未从 EditText 获取文本

java - 外推 OutOfRangeException Apache Commons Math