Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 日期构造函数:数字参数与字符串参数在某些情况下给出不同的日期_Javascript_Date_Constructor - Fatal编程技术网

Javascript 日期构造函数:数字参数与字符串参数在某些情况下给出不同的日期

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 …至少在这种情

首先,我认为时区可能与此有关。我在东部时间/东部时间。另外,我正在chromium 17/linux上测试这一点

现在,假设我创建了两个日期,如下所示:

// 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
    不是打字错误
  • 这个问题出现在我检查的每一年中
使用“-”作为美国日期的日期分隔符会混淆一些浏览器,有些浏览器会执行日期算术,有些浏览器会返回NaN,因此请使用“/”日期分隔符。有文化意识的解决方案是使用date.js,这是一个优秀的JavaScript日期处理程序,可以解决您所指出的问题(http://www.datejs.com/). 使用parse方法可以消除所有混淆:

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个日期
大多数格式被解释为本地日期

在第14页,我们看到:

一天中的日期和时间应表示为当地时间

非标准日期也以类似方式处理

ES 5格式被解释为UTC

在ES 5规范中,我们看到:

缺少时区偏移的值为“Z”

“Z”表示UTC时间

十月十日

ES 5格式的日期需要两位数的月和日。原始帖子中的月份和天数不是零填充的。“2020-9-9”不是有效的ES 5日期表述;这是一种非标准格式,因此在当地时间进行解释。“2020-10-10”是有效的ES 5日期表示,因此必须以UTC进行解释

可能的解决办法

  • 不要使用字符串构造函数/Date.parse
  • 更改分隔符字符,使格式永远与ES 5格式不匹配
  • 指定时区
  • 根据当地时间调整日期。如果它们有小时或分钟:
    date.setMinutes(date.getTimezoneOffset())(无论如何,这似乎是可行的)

在您的第二个案例中,日期为2020年11月15日和2020年12月15日。这是打字错误吗?运行Chrome 18.0.1025.162 m,Windows,GMT+2:结果是可复制的。但是在字符串表示中显式指定时间可以解决这个问题。我通常避免使用字符串的日期,因为跨浏览器的格式支持多种多样,而且文档记录也很差,毫秒更可靠。尝试使用“/”而不是“-”。GGG对我的答案投了反对票。我本应该详细阐述一下,现在就这么做了。哦,对不起,但这是我应得的。