Javascript,日期.不带时区的解析
Javascript, Date.parse with no timezone
我有一个Javascript日期的问题。
我收到一个包含日期的JSON,当我试图获得date对象时,它会在不同的时区返回值,并且通常会将日期移动到前一天的20小时。
的例子:
json中的值为:"2014-06-01T00:00:00"
当我做
var d2 = new Date(Date.parse("2014-06-01T00:00:00"))
返回2014年5月31日星期六20:00:00 GMT-0400(东部夏令时)
When I expected
Sun Jun 01 2014 00:00:00 GMT-0400
如何解决这个问题?
谢谢
Date.parse
返回UTC中epoch以来的毫秒数,因此无论传入什么日期/时间字符串,都将得到UTC。(详见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)
如果要将其转换为本地时间,则必须知道与UTC的偏移量。你可以这样从JavaScript中获取:
var offset = new Date().getTimezoneOffset()*60*1000;
(Date.prototype.getTimezoneOffset
以分钟为单位返回偏移量,因此我们必须转换为毫秒。)
那么你可以用偏移量构造你的日期:
var date = new Date(Date.parse("2014-06-01T00:00:00") + offset);
如果您想将该日期解释为位于不同的时区,则只需使用适合该时区的任何毫秒偏移量。不过,请记住夏令时:这肯定会使事情复杂化。
来自Date.parse
的Mozilla文档:
ECMAScript 5 ISO-8601格式支持
日期/时间字符串也可以采用ISO 8601格式。例如"2011-10-10";(只是日期)或者"2011-10-10t14:48:00";(日期和时间)可以传递和解析。UTC时区用于解释ISO 8601格式中不包含时区信息的参数。
您的值不包括时区信息,因此它被假定为UTC。问题当天的午夜UTC是您当地时区的晚上8点。注意,Date
对象本身没有时区的概念—它只是从Unix纪元开始的毫秒数。当您将其转换为带有toString
的字符串时,使用浏览器的本地时区。您可以使用toUTCString
将其转换为使用UTC的文本表示(因此在这种情况下,您将以开始时的UTC午夜结束)。
现在你可以做些什么来"修复";这个问题……首先,你需要理解你想要表达的价值,以及你想用它做什么。如果没有更多的信息,我们无法真正帮助你。
- 获取用户选择的不带时区的日期
- 分析特定区域设置(而不是时区!)中的日期字符串
- moment.js在两个时区格式的日期之间存在差异
- 获取本地时间的JS日期,日期对象中没有时区详细信息
- Javascript-将时区添加到日期倒计时中
- 使用JavaScript日期的任何时间的时区偏移量
- javascript日期时区问题
- 读取本地时区的日期的Javascript
- 时刻时区.js允许我传递时区缩写并获取转换后的日期/时间
- 转换 JSON 日期,不考虑时区
- 如何使用 JavaScript 更改日期的时区而不更改时间
- 如何将 UTC 日期时间(字符串)转换为访问者时区
- 情节.js为类型设置时区:“日期”
- 在 Jquery 中比较不同的时区日期
- Java 在 Java 中转换毫秒日期对应的时区日期
- 在 JS 中返回干净的无时区日期
- 将UTC中的Epoch转换为当前时区日期
- 将本地时区日期对象转换为UTC时区日期对象的优雅方式
- 显示任意时区日期的Dygraph
- 在 Javascript 中将 ISO 8601 字符串转换为当前时区日期时间对象