【问题标题】:Parse YYYY-MM-DD dates using the local timezone使用本地时区解析 YYYY-MM-DD 日期
【发布时间】:2013-07-27 03:17:13
【问题描述】:

在javascript中,如果我将日期指定为MM/DD/YYYY,我可以使用new Date()将其解析为本地时区:

>>> new Date('01/01/1970')
Date {Thu Jan 01 1970 00:00:00 GMT-0500 (EST)}

但是,如果我将日期指定为 YYYY-MM-DD,则假定我在 UTC 时区中给出日期:

>>> new Date('1970-01-01')
Date {Wed Dec 31 1969 19:00:00 GMT-0500 (EST)}

在解析“YYYY-MM-DD”日期时,是否有一种简单的方法可以告诉日期解析器使用本地时区?还是我需要先用.replace(/^(\d{4})-(\d{2})-(\d{2})$/, '$2/$3/$1')修复?

【问题讨论】:

  • 根据developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,“如果不指定时区,则假定为本地时区。”我不知道为什么不是这样。
  • new Date('1970-01-01'.replace(/-/g,'/')),它会被解析为本地时间。
  • 我觉得这个thread可以给你很多关于Data.parse的见解:)
  • 好问题。这个问题让我发疯了好几个小时。

标签: javascript date


【解决方案1】:

Date.parse 的行为如下:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

函数首先尝试根据日期时间字符串格式(15.9.1.15)中调用的规则解析字符串的格式。如果字符串不符合该格式,则函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

ECMAScript 基于 ISO 8601 扩展格式的简化定义了日期时间的字符串交换格式。格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

Z 是指定为“Z”(对于 UTC)或“+”或“-”后跟时间表达式 HH:mm

的时区偏移量

缺席时区偏移的值为“Z”。

所以在第一种情况下,由于它不符合日期时间字符串格式,因此特定于实现的解析生效(恰好基于本地时间)。在第二种情况下,它确实符合 DTSF,因此它被解析为好像未指定时区(应该是 UTC),因此存在差异

【讨论】:

    【解决方案2】:

    下面的函数将完全按照您的意愿进行操作,因此您可以传递格式为“YYYY-MM-DD”的字符串,它将返回您当地时区的日期对象。

    function yyyymmddToLocalDate(isoString) {
      const [year, month, day] = isoString.split('-');
      return new Date(year, month - 1, day);
    }
    

    例如,如果您在巴西并将其称为 yyyymmddToLocalDate('2020-10-07'),它将返回 Wed Oct 07 2020 00:00:00 GMT-0300 (Brasilia Standard Time)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多