我正在开发一个非常小的 JavaScript 库,它允许用户根据日期检索内容。对于这个内容,日期只是一个标识符,时区是完全不相关的(按照Dilbert 翻转日历的思路思考)。“5月14日”的内容不管你是在美国还是澳大利亚,都是一样的。
检索数据的函数目前将Date 对象作为参数。在函数中,时区被忽略。这种方法是否有意义,或者最好采用独立于时区的标识符(例如2012-01-01)作为参数会更好吗?使用 Date 对象方法,由于浏览器进行时区调整,我是否会冒返回错误数据的风险?
我正在开发一个非常小的 JavaScript 库,它允许用户根据日期检索内容。对于这个内容,日期只是一个标识符,时区是完全不相关的(按照Dilbert 翻转日历的思路思考)。“5月14日”的内容不管你是在美国还是澳大利亚,都是一样的。
检索数据的函数目前将Date 对象作为参数。在函数中,时区被忽略。这种方法是否有意义,或者最好采用独立于时区的标识符(例如2012-01-01)作为参数会更好吗?使用 Date 对象方法,由于浏览器进行时区调整,我是否会冒返回错误数据的风险?
使用 Date.getUTC*() 函数怎么样?每个人的UTC时间都是一样的。
在做了一些研究之后,似乎简单地忽略时区信息是最好的方法。为什么?这将始终保留提供给 Date 构造函数的日期和时间(这是我的目标),而 getUTC* 方法将返回日期和时间的更改版本。例如,看看我在东部时区的计算机上运行的这个节点REPL会话。
> d = 新日期(2013, 03, 27, 23, 00, 00) 2013 年 4 月 27 日星期六 23:00:00 GMT-0400 (EDT) > d.getDate() // 构造函数中提供的相同日期。哇! 27 > d.getUTCDate() // 不同的日期。嘘! 28
长话短说,如果您想读取 Date 构造函数中提供的确切日期和时间,使用普通的 get* 方法(如 getDate)即可。如果您使用 getUTC* 方法(如 getUTCDate),则将返回日期和时间的修改版本。
我知道这对于一些更有经验的程序员来说可能听起来很初级,但这确实帮助我理解了事情。我希望它可以帮助其他人。
在您自己的答案中,该方法的唯一问题是它没有考虑到模棱两可的时间。这发生在夏令时回退过渡期间。
例如,将计算机的时区设置为美国山区时间(Windows 上为“山区时间(美国和加拿大)”,mac/linux 上为“美国/丹佛”)。然后重新启动浏览器并运行以下 javascript:
var dt = new Date(2013,10,3,1,0);
alert(dt);
这是 2013 年 11 月 3 日凌晨 1 点。但是你不知道它代表的是哪个1:00 AM。是过渡前的山区夏令时间 (UTC-6),还是过渡后的山区标准时间 (UTC-7)?无法判断,JavaScript 只会使用标准时间。
现在,如果您只需要2013-11-03 01:00
- 那么您是正确的。您可以忽略偏移量并完成它。但是,如果您打算将该值用于任何有意义的事情 - 例如记录一个时间点,或者从另一个时间点减去它们之间的持续时间,那么您就会遇到一个没有偏移量就无法解决的问题。
不幸的是,在 JavaScript 中这个问题没有很好的解决方案。最接近的是Moment.js,但它仍然不完美。尽管如此,它还是比Date
对象本身要好,因为它绕过了浏览器的不一致并提供了更好的解析和格式化。