9

在 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')它来修复它?

4

2 回答 2

3

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),因此存在差异

于 2013-07-27T07:59:20.517 回答
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)

于 2020-10-04T20:44:11.683 回答