3

我正在开发一个非常小的 JavaScript 库,它允许用户根据日期检索内容。对于这个内容,日期只是一个标识符,时区是完全不相关的(按照Dilbert 翻转日历的思路思考)。“5月14日”的内容不管你是在美国还是澳大利亚,都是一样的。

检索数据的函数目前将Date 对象作为参数。在函数中,时区被忽略。这种方法是否有意义,或者最好采用独立于时区的标识符(例如2012-01-01)作为参数会更好吗?使用 Date 对象方法,由于浏览器进行时区调整,我是否会冒返回错误数据的风险?

4

3 回答 3

2

使用 Date.getUTC*() 函数怎么样?每个人的UTC时间都是一样的。

于 2013-04-27T22:15:42.823 回答
1

在做了一些研究之后,似乎简单地忽略时区信息是最好的方法。为什么?这将始终保留提供给 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),则将返回日期和时间的修改版本。

我知道这对于一些更有经验的程序员来说可能听起来很初级,但这确实帮助我理解了事情。我希望它可以帮助其他人。

于 2013-04-28T02:51:16.220 回答
1

在您自己的答案中,该方法的唯一问题是它没有考虑到模棱两可的时间。这发生在夏令时回退过渡期间。

例如,将计算机的时区设置为美国山区时间(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对象本身要好,因为它绕过了浏览器的不一致并提供了更好的解析和格式化。

于 2013-04-28T21:03:29.497 回答