Java/JavaScript 日期 : Is this true?

标签 java javascript date

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

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

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

最佳答案

文章中有一些很好的建议 Scaling lessons learned at Dropbox, part 1 :

Keep everything in UTC internally! Server times, stuff in the database, etc. This will save lots of headaches, and not just daylight savings time. Some software just doesn’t even handle non-UTC time properly, so don’t do it! We kept a clock on the wall set to UTC. When you want to display times to a user, make the timezone conversion happen at the last second.


将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 对象都将反射(reflect)各自的时区,因此如果您查看两者,它们可能看起来不同,但如果您转换它们则不然他们使用相同的时区回到 UTC。


所以回答你的问题:

If I create a JavaScript Date object with those milliseconds, will it result in the original date?

是的。

Java 的 Date(long date) constructorgetTime() method使用 unix 时间毫秒操作。 JavaScript 的 getTime() 也是如此。和 Date constructor .除 Coordinated Universal Time 外,不应涉及其他时区(格林威治标准时间/协调世界时)。

关于Java/JavaScript 日期 : Is this true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11531291/

相关文章:

java - 如何在 Spring 上下文初始化之前模拟 REST 服务器?

java - Spring roo是否使用jspx作为 View 技术

javascript - 无法获取克隆元素以保留原始事件

javascript - 在 webview WinRt 中获取导航 url

java - 字符串到 java.sql.Date

java - 重命名包后出现 NoClassDefFoundError

java - 如何在 Android 中创建必填字段 validator ?

javascript - 支持内容脚本中的所有谷歌域

JQuery 输入[type=date] 选择器

ruby - 为什么 "23 Dogs"在 pry 中被解析为 2015 年 11 月 23 日,但 "3 Dogs"给出解析器错误?