在JavaScript中表示与时区无关的日期

Representing a date in JavaScript when timezone is irrelevant

本文关键字:日期 时区 JavaScript 表示      更新时间:2023-09-26

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

检索数据的函数目前接受Date对象作为参数。在函数中,时区被忽略。这种方法有意义吗?还是使用与时区无关的标识符(如2012-01-01)作为参数更好?使用Date对象方法,我是否会冒由于浏览器所做的时区调整而返回错误数据的风险?

如何使用Date.getUTC*()函数?UTC时间对每个人都是一样的

在做了一些研究之后,似乎忽略时区信息是最好的方法。为什么?这将始终保留提供给date构造函数的日期和时间(这是我的目标),而getUTC*方法将返回日期和时间的更改版本。例如,看一下我在东部时区的计算机上运行的这个节点REPL会话。

<>之前> d = new Date(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),将返回修改过的日期和时间版本。

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

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

例如,将您的计算机时区设置为美国山地时间("山地时间(US &windows上的"Canada",mac/linux上的"America/Denver")。然后重新启动浏览器并运行以下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对象本身要好,因为它解决了浏览器的不一致性,并提供了更好的解析和格式化。