Javascript 日期构造函数:数字参数与字符串参数在某些情况下给出不同的日期
首先,我认为时区可能与此有关。我在东部时间/东部时间。另外,我正在chromium 17/linux上测试这一点 现在,假设我创建了两个日期,如下所示:Javascript 日期构造函数:数字参数与字符串参数在某些情况下给出不同的日期,javascript,date,constructor,Javascript,Date,Constructor,首先,我认为时区可能与此有关。我在东部时间/东部时间。另外,我正在chromium 17/linux上测试这一点 现在,假设我创建了两个日期,如下所示: // December 5 dateFromNumbers = new Date(2020, 11, 5); dateFromString = new Date("2020-12-5"); 看起来这些日期应该有相同的时间戳,它们确实: +dateFromNumbers == +dateFromString; // true …至少在这种情
// December 5
dateFromNumbers = new Date(2020, 11, 5);
dateFromString = new Date("2020-12-5");
看起来这些日期应该有相同的时间戳,它们确实:
+dateFromNumbers == +dateFromString; // true
…至少在这种情况下。但在某些情况下,它们不会:
// December 15
dateFromNumbers = new Date(2020, 11, 15);
dateFromString = new Date("2020-12-15");
+dateFromNumbers == +dateFromString; // false
这是怎么回事
dateFromNumbers; // Tue Dec 15 2020 00:00:00 GMT-0500 (EST)
dateFromString; // Mon Dec 14 2020 19:00:00 GMT-0500 (EST)
在这种情况下,dateFromString
比dateFromNumbers
早5个小时(EST是GMT-5,我相信这是有关联的)
它似乎影响到10月底到12月底。这里有一把小提琴,可以很容易地看到不同的日子(除非你是红-绿色盲,在这种情况下可能很难看到,我道歉)
有什么好处
注:
- 您可以将系统时区设置为EST/EDT,以查看我看到的JSFIDLE示例
- 日期的月份数字以零为基础;
不是打字错误11
- 这个问题出现在我检查的每一年中
Date.parse("2020-12-15").toString() // yields the correct date ("Tue Dec 15 00:00:00 PST 2020").
从另一方面讲,Date
的字符串参数构造函数似乎对实现敏感,这是由于浏览器的各种Date.parse()
实现造成的
您的测量是正确的,如果希望浏览器正确解析EST,您可能应该避免使用此构造函数。查看后:
在“YYYY-MM-DD”的情况下,一旦代码达到这个程度,ES5解析器就成功地解析了整个字符串,因此它会在遗留解析器有机会本地化时区之前返回。否则(月/日为一个符号长)将其视为“遗留”日期时间,遗留解析器将处理并对其进行本地化。看起来日期构造函数需要空格而不是“-”。这是推荐的方式。查看此链接:
尽管在整个日期时间内允许折叠空白 规范中,建议在中使用单个空间 FWS出现的每个位置(无论是必需的还是可选的) 也请查看此链接:
dateString:表示日期的字符串值。该字符串应位于 解析方法识别的格式(符合IETF的RFC 2822 时间戳) 我尝试了以下代码,它返回true
dateFromNumbers = new Date(2020, 11, 15);
dateFromString = new Date("2020 12 15");
alert(+dateFromNumbers == +dateFromString);
dateFromNumbers = new Date(2020, 8, 15);
dateFromString = new Date("2020-9-15");
alert(+dateFromNumbers == +dateFromString); // This returns true
dateFromNumbers = new Date(2020, 8, 15);
dateFromString = new Date("2020 09 15");
alert(+dateFromNumbers == +dateFromString);//This returns true
同样,从10月份开始也不是问题,它与两位数的月份有关。如果我在九月尝试同样的方法,那么:
dateFromNumbers = new Date(2020, 8, 15);
dateFromString = new Date("2020-09-15");
alert(+dateFromNumbers == +dateFromString); // This returns false
但如果我在9月份使用一位数,那么它将返回true
dateFromNumbers = new Date(2020, 11, 15);
dateFromString = new Date("2020 12 15");
alert(+dateFromNumbers == +dateFromString);
dateFromNumbers = new Date(2020, 8, 15);
dateFromString = new Date("2020-9-15");
alert(+dateFromNumbers == +dateFromString); // This returns true
dateFromNumbers = new Date(2020, 8, 15);
dateFromString = new Date("2020 09 15");
alert(+dateFromNumbers == +dateFromString);//This returns true
如果使用两位数的空格,则返回true
dateFromNumbers = new Date(2020, 11, 15);
dateFromString = new Date("2020 12 15");
alert(+dateFromNumbers == +dateFromString);
dateFromNumbers = new Date(2020, 8, 15);
dateFromString = new Date("2020-9-15");
alert(+dateFromNumbers == +dateFromString); // This returns true
dateFromNumbers = new Date(2020, 8, 15);
dateFromString = new Date("2020 09 15");
alert(+dateFromNumbers == +dateFromString);//This returns true
下面是从其他答案中提取的简化答案 日期识别不同的字符串格式
- 非标准日期
- RFC 2282日期
- 5个日期
- 不要使用字符串构造函数/Date.parse李>
- 更改分隔符字符,使格式永远与ES 5格式不匹配
- 指定时区
- 根据当地时间调整日期。如果它们有小时或分钟:
date.setMinutes(date.getTimezoneOffset())代码>(无论如何,这似乎是可行的)