10

因此,假设用户在与应用程序服务器不同的时区从他的浏览器运行我的 Web 应用程序。date.getTime()我使用 JavaScript 的方法在客户端序列化日期。我通过 Json 发送生成的毫秒数,然后通过调用在服务器端创建一个 Java Date 对象new Date(millisecondsFromJS)。我将它存储在 MySql 上,检索它,通过调用 Java 再次对其进行序列化,date.getTime()并通过 Json 再次将其发送给客户端。

如果我用这些毫秒创建一个 JavaScript Date 对象,它会产生原始日期吗?我已经成功完成了这个过程,但是客户端和服务器目前在同一个时区。如果时区不同,我不确定日期是否会在此过程中损坏。

据我了解,使用 getTime() 返回一个与时区无关的瞬间。例如,如果用户捕获 2012 年 7 月 17 日下午 4:39 CDT,服务器可能会将其存储为 2012 年 7 月 17 日晚上 11:39 CEST,但是一旦服务器将其转换为自 GMT 以来的毫秒数并且客户端创建一个从这些毫秒开始,它将成功地重建原始的 2012 年 7 月 17 日 CDT 下午 4:39。这是真的?

4

2 回答 2

12

在 Dropbox 的扩展经验教训文章第 1 部分中有一些很好的建议:

内部保持 UTC 格式!服务器时间,数据库中的东西等。这将节省很多麻烦,而不仅仅是夏令时。有些软件甚至不能正确处理非 UTC 时间,所以不要这样做!我们将墙上的时钟设置为 UTC。当您想向用户显示时间时,请在最后一秒进行时区转换。


将 unix 时间毫秒数发送到服务器,您就知道用户选择了哪个时间点。然后以 UTC 处理服务器上的所有内容并将毫秒整数返回给客户端。

客户端/JavaScript:

var date = new Date();
var clientMilliseconds = date.getTime();
// send clientMilliseconds to server

服务器/Java:

Date date = new Date(clientMilliseconds);
// store the date, then get it back
long serverMilliseconds = date.getTime();
// send serverMilliseconds back to client

客户端/JavaScript:

var date = new Date(serverMilliseconds);
// If receiving the error "Invalid Date", serverMilliseconds
// needs to be converted to an Integer. Consider:
// parseInt: parseInt(serverMilliseconds, 10)
// unary +:  (+serverMilliseconds)

在此过程中,date服务器和客户端上的对象都将反映各自的时区,因此如果您同时查看两者,它们可能看起来不同,但如果您使用相同的时区将它们转换回 UTC,它们就不是了。


所以回答你的问题:

如果我用这些毫秒创建一个 JavaScript Date 对象,它会产生原始日期吗?

是的。

Java 的Date(long date)构造函数getTime()方法以 unix 时间毫秒运行。JavaScriptgetTime()Date构造函数也是如此。除了协调世界时(GMT/UTC)之外,不应涉及其他时区。

于 2012-07-17T22:14:27.133 回答
2

有一些问题

  • 客户在不同的时区。如果您使用 等,这不是真正的问题.getTime().valueOf()因为根据 UTC,它们自 epoch 以来使用 ms。
  • 真正的问题是客户的时钟可能会出现偏差。例如,如果有人为了避免注册某些程序而及时设置了他们的计算机,这将导致客户端生成错误的时间戳
  • 它们也可能有少量的偏斜,只是因为时钟这样不准确

您可以通过从服务器发送时间戳然后将其与客户端生成的时间戳进行比较来解决此问题,以获得偏度偏移量。然后,您将此偏斜偏移应用于new Date.getTime()您在客户端生成的所有 s。尽管如果客户在使用您的页面时更改其系统时间,这将不起作用。

于 2012-07-17T21:47:36.653 回答