javascript - 使用破折号而不是斜杠将日期字符串转换为日期对象会产生不一致的结果

标签 javascript datetime

我正在尝试将 javascript 日期字符串转换为日期对象。似乎当我用斜杠格式化字符串时,比如 2010/05/21,我得到了我期待的日期对象,但是当我用破折号格式化字符串时,比如 2010-05 -21,我得到一个不同的日期对象,它似乎指的是前一天。

以下代码说明了我的问题:

var aDate = new Date('2010-05-21')
console.log(aDate.toDateString())
console.log(aDate.toISOString())

console.log('=-=-=-=-=')

var anotherDate = new Date('2010/05/21')
console.log(anotherDate.toDateString())
console.log(anotherDate.toISOString())

以上代码产生以下输出:

2010-05-21T00:00:00.000Z
Thu May 20 2010
=-=-=-=-=
2010-05-21T06:00:00.000Z
Fri May 21 2010

似乎部分问题可能与时区有关,因为获取日期对象的 ISO 字符串显示日期对象彼此相隔 6 小时,但我不知道为什么使用破折号而不是斜杠会导致那个。我在 MacOS Sierra 上使用 Google Chrome,以防相关。

最佳答案

2010/05/21 是一种非 ISO 日期格式,因此支持将取决于浏览器实现。一些浏览器可能会拒绝它,其他浏览器会接受它但使用不同的时区。看起来您的浏览器正在用您本地的时区解析 2010/05/21

2010-05-21 是一个简化的 ISO 8601格式,所以 ES5+ 有关于如何解析它的规范。特别是,it must assume the UTC time zone .

您可以通过将其与您的浏览器解析 ISO 8601 日期和时间(ES5 规范称 must use the local time zone)的方式进行比较来验证它是否使用您的本地时区。

var dateNonISO = new Date('2010/05/21');
var dateLocal = new Date('2010-05-21T00:00:00');
var dateUTC = new Date('2010-05-21');

console.log("Non-ISO:", dateNonISO.toISOString());
console.log("ISO Local:", dateLocal.toISOString());
console.log("ISO UTC:", dateUTC.toISOString());

关于javascript - 使用破折号而不是斜杠将日期字符串转换为日期对象会产生不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46373384/

相关文章:

javascript - 来自 ajax 对 img 标签的响应的 base64 字符串

javascript - AngularJS ng-repeat 与过滤器

Javascript object.id 在元素数组中返回 "undefined"

javascript - 编辑不适用于新添加的数据 - knockout

c# - 流畅的断言 : Using BeCloseTo on a collection of DateTime properties

datetime - 时区的正确命名法是什么?

javascript - Puppeteer 获取请求重定向

MySQL - 更新日期时间

c# - 如何在不丢失 TZinfo 的情况下解析此 DateTime?

python - 检查列表中的任何时间是否在两个时间戳之间