当时区不相关时,用JavaScript表示日期

当时区不相关时,用JavaScript表示日期,javascript,api,timezone,Javascript,Api,Timezone,我正在开发一个非常小的JavaScript库,它允许用户根据日期检索内容。对于这些内容,日期只是一个标识符,时区是完全不相关的(按照a的思路思考)。无论你是在美国还是在澳大利亚,“5月14日”的内容都是一样的 用于检索数据的函数当前将a作为参数。在函数中,时区被忽略。这种方法有意义吗,还是将时区独立标识符(如2012-01-01)作为参数更好?使用日期对象方法时,浏览器是否会因时区调整而返回错误数据?使用Date.getUTC*()函数如何?UTC时间对每个人都是一样的。在做了一些研究之后,似乎

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


用于检索数据的函数当前将a作为参数。在函数中,时区被忽略。这种方法有意义吗,还是将时区独立标识符(如2012-01-01)作为参数更好?使用日期对象方法时,浏览器是否会因时区调整而返回错误数据?

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

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

> d = new Date(2013, 03, 27, 23, 00, 00) Sat Apr 27 2013 23:00:00 GMT-0400 (EDT) > d.getDate() // The same date provided in the constructor. Woo! 27 > d.getUTCDate() // A different date. Boo! 28 >d=新日期(2013年3月27日23日00时00分) 2013年4月27日星期六23:00:00 GMT-0400(美国东部时间) >d.getDate()//与构造函数中提供的日期相同。求爱! 27 >d.getUTCDate()//另一个日期。喝倒采 28 长话短说,如果您想要读取日期构造函数中提供的确切日期和时间,那么使用普通的get*方法(比如getDate)就可以做到这一点。如果使用getUTC*方法(如getUTCDate),将返回日期和时间的修改版本


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

在你自己的回答中,这种方法唯一的问题是它不能解释模棱两可的时间。这在夏令时回退过渡期间发生

例如,将计算机的时区设置为美国山区时间(windows上为“山区时间(美国和加拿大)”,mac/linux上为“美国/丹佛”)。然后重新启动浏览器并运行以下javascript:

var dt = new Date(2013,10,3,1,0);
alert(dt);
这是2013年11月3日凌晨1:00。但你不知道它代表的是哪一个凌晨1点。过渡前是山地昼时(UTC-6),还是过渡后是山地标准时间(UTC-7)?没有办法判断,JavaScript只会使用标准时间

现在,如果您只需要
2013-11-03 01:00
,那么您是正确的。您可以忽略偏移量,然后处理它。但是,如果你打算将该值用于任何有意义的事情,比如记录一个时间点,或者从另一个时间点减去它们之间的持续时间,那么你就有一个没有偏移量就无法解决的问题


不幸的是,JavaScript并没有很好的解决方案。最近的事情是,但它仍然是。不过,它本身比
Date
对象要好,因为它可以避免浏览器的不一致,并提供更好的解析和格式设置。

我认为我最大的问题就是不理解Date对象是如何工作的。如果有人给我一个日期(2011、05、14),getUTC函数是否会返回一个代表第15(或第13)个的值?如果有人给我一个离格林尼治标准时间午夜还有一个小时的日期,并且有两个小时的时区偏移,那不是这样吗?如果我在这里讲不通,请原谅我。时区(和Unicode)有点让我头晕目眩。getUTC函数只会从当前时间添加(或减去)用户设置的时区以获得UTC。所以,是的,如果用户将从未来传递时间-它将从未来提供utc时间。但您需要记住,所有javascript都在用户域中。用户不需要传递错误的值,只需将计算机时钟设置为他想要的任何时间(或时区)。因此,如果你需要确保日期信息是有效的-从服务器上查询它。我不确定我是否理解你的意思。顺便说一句,谢谢你的帮助。对不起,按enter键是偶然的。注释现在要复杂得多:)@parnas:不,相反,本地方法从当前时间中减去偏移量。我建议使用UTC和
new Date(Date.UTC(2011,5,14))
(或者立即使用历元时间戳)来构造
Date
对象。只要始终使用UTC(JS日期的内部表示的时区),您就不会遇到太多麻烦。等等,这就是您想要的?哈,我有点想过头了:)谢谢你非常详细的回答。在我的例子中,我只需要我的库的用户有一个方便的方式来表示过去的某个日期。“1995年3月3日”或“2010年7月15日”的便捷表达方式。日期永远不需要表示当前时间,也永远不会与当前时间进行比较。唯一的要求是,他们指定的日期在他们指定日期和我阅读日期之间不发生变化。根据我自己的回答,Date对象(使用普通的get*方法)似乎是这个问题的一个很好的解决方案。听起来你同意第4段?@FallingPlates-是的,那么你的所有要求都符合你所描述的。你应该没事