8

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

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

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

Date currentDate = new Date();
System.out.println(currentDate .getTime());
System.out.println(currentDate);

Java 控制台输出:

1360753217219

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


然后我的javascript插件正在使用这个长对象,如下所示;

Javascript:

console.log(new Date(1360753217219));

浏览器控制台输出:

日期 {2013 年 2 月 13 日星期三 13:00:17 GMT+0200(土耳其标准时间)}


不过没关系!将我的本地时区更改为(UTC-04:30)加拉加斯后,情况和小时以相同的毫秒数变化如下;


Javascript:

console.log(new Date(1360753217219));

浏览器控制台输出:

日期 {2013 年 2 月 13 日星期三 06:30:17 GMT-0430(委内瑞拉标准时间)}

有人可以解释一下吗?那是js的错误吗?或者更重要的是,我应该如何在 java 端处理这个问题,以在 js 端的不同时区获得相同的日期和相同的毫秒数?

谢谢!

4

3 回答 3

10

毫秒与时区无关。自格林威治标准时间 1970 年 1 月 1 日起,时间以绝对值计量。所以,这个想法是你得到毫秒,然后在事后计算出给定时区的本地时间。如果你仔细想想,这是有道理的。无论您身在何处,自 1970 年以来经过的毫秒数都是相同的。

它有点令人困惑,但不要以毫秒为单位来调整时区。每个 Date 库都有将毫秒标记转换为特定时区的本地时间的机制。

因此,如果您的具体问题是如何在服务器和客户端之间有效地传达日期(您使用的语言并不重要),那么答案是来回传递毫秒并在任一方计算出全局是完全安全的您正在谈论的特定时间,如果这对您在该时间所做的事情的背景很重要。

于 2013-02-13T11:53:46.287 回答
2

不是错误,这就是时区的工作方式。

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

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

因此,无论多少秒后,委内瑞拉的时间仍将比格林威治标准时间早 4:30 小时。

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

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

于 2013-02-13T11:50:36.853 回答
1
于 2017-06-18T02:57:33.957 回答