为什么日期在不同时区以相同的毫秒数变化?

gok*_*ari 7 javascript java timezone date primefaces-extensions

我们知道java.util.Date的getTime方法返回自此Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数.

我注意到一个奇怪的情况如下;

系统时区为:(UTC + 02:00)伊斯坦布尔

Date currentDate = new Date();
System.out.println(currentDate .getTime());
System.out.println(currentDate);
Run Code Online (Sandbox Code Playgroud)

Java ConsoleOutput:

1360753217219

2月13日星期三13:00:17 VET 2013


然后我的javascript插件使用如下的长对象;

使用Javascript:

console.log(new Date(1360753217219));
Run Code Online (Sandbox Code Playgroud)

浏览器控制台输出:

日期{Wed Feb 13 2013 13:00:17 GMT + 0200(土耳其标准时间)}


但是,一切都好!将当地时区更改为(UTC-04:30)加拉加斯后,情况和小时的变化如下,并以相同的毫秒数变化;


使用Javascript:

console.log(new Date(1360753217219));
Run Code Online (Sandbox Code Playgroud)

浏览器控制台输出:

日期{Wed Feb 13 2013 06:30:17 GMT-0430(委内瑞拉标准时间)}

有人可以解释一下吗?这是js的bug吗?或者更重要的是,我应该如何在java方面处理这个问题,以便在js端为不同的时区获得相同的毫秒数?

谢谢!

Gen*_* S. 8

毫秒是时区不可知的.自格林威治标准时间1970年1月1日起,时间以绝对值计算.所以,我们的想法是你得到毫秒,然后计算出事后的给定时区的本地时间.如果你考虑一下,这是有道理的.无论您身在何处,自1970年以来经过的毫秒数都是相同的.

它有点令人困惑,但为了调整时区,不要用毫秒面条.每个日期库都具有将毫秒标记转换为特定于时区的本地时间的机制.

因此,如果您的具体问题是如何在服务器和客户端之间有效地传达日期(您使用的语言并不重要),那么答案是来回传递毫秒以及在全球范围内解决问题是完全安全的你所谈论的特定时间,如果这对你当时正在做的事情的背景很重要.


yur*_*rib 3

不是错误,这就是时区的工作原理。

如果你现在打电话给委内瑞拉的某人并问他现在几点,他会告诉你现在比土耳其时间早 6.5 小时(根据你的例子)。

正如您所提到的,您正在处理的数字代表自 1970 年 00:00:00 GMT以来的毫秒数,同一秒在加拉加斯,时间为 31.12.1969 19:30 GMT-0430

因此,无论晚多少秒,委内瑞拉的时间仍比 GMT 早 4:30 小时。

如果您使用相同的输入(毫秒),您将无法在不同时区获得完全相同的日期,因为这根本就是错误的。

如果您想获得相同的结果,可以将时区差异(本例中为 6.5 小时)添加到输出中。按照 Dr.Dredel 的建议,你可能不应该搞乱毫秒。