js里面的new date问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js里面的new date问题相关的知识,希望对你有一定的参考价值。

<html>
<script>
function asasa()
var date1=new Date('2018/09/13');
var date2=new Date('2018-09-13');
alert("date1:"+date1.getTime()+"\n\r"+"date2:"+date2.getTime())

</script>
<body>
<input type="button" value="test" onclick="asasa()">
</body>
</html>

上面的这些代码。date1和date2为什么不相等呢?跟js里面月份从0开始有关?

了解了一下Date()函数在作为构造函数时的解析日期字符串参数的规则,感觉最佳答案个人觉得并不是很全面,所以这里写一下自己的看法。
Date()函数像题主的这种用法,即作为构造函数使用,当传入日期字符串的时候,内部其实会调用Date.parse()方法解析日期字符串,根据MDN文档的说法,该日期字符串的要求是“符合 RFC2822 或 ISO 8601 日期格式的字符串(其他格式也许也支持,但结果可能与预期不符)”。像'2018-09-13'这种就是ISO 8601的日期格式,文档中有说明对于ISO 8601日期格式的处理说明:“如果参数字符串只包含日期格式,那么将会使用UTC时区来解析该参数。而如果是ISO 8601 格式中规定的时间加日期的格式,则将会被作为本地时区处理”。
这句话简单的理解就是如果你传的字符串参数不包含时间,那么则表示的是中时区(零时区,本初子午线)的0点0分0秒,转换成北京时间(东八区)自然就得加8个小时咯,所以new Date('2018-09-13')返回的是“Thu Sep 13 2018 08:00:00 GMT+0800 (中国标准时间)”。根据上面的那句话,new Date('2018-09-13T08:00:00')应该与'2018-09-13'返回的是一样的结果,测试确实如此,因为加上时间的话,就会作为本地时区处理。
而“2018/09/13”这种不包含时间的日期格式(并不属于ISO 8601格式,属于什么标准自行了解,我也不懂),显然是直接当做本地时间处理了。你只需要记住,当使用ISO 860即'2018-09-13'这种格式的日期字符串的时候,记得要把时间补全,即便是零,例如new Date('2018-09-13T00:00:00')。
参考技术A

'2018-09-13' 是 ISO 8601 格式的日期字符串, 如果参数字符串只包含日期格式,会使用UTC时区来解析该参数。如果是规定的时间加日期的格式,则将会被作为本地时区处理。

var date1=new Date('2018-09-13 00:00:00'); // 1536768000000  本区时区
var date2=new Date('2018-09-13');          // 1536796800000  UTC时区

'2018/09/13' 是非 ISO 格式字符串, 如果一个字符串不符合标准格式,则函数可以使用任何由引擎决定的策略或解析算法

参考技术B 这跟时区有关,date1是格林威治时间,date2是北京时间,date2比date1多8小时

以上是关于js里面的new date问题的主要内容,如果未能解决你的问题,请参考以下文章

js 的new date()问题,求救啊,急啊

关于JS中new date 函数的问题

js 的Date怎么给参数

js new Date(String) 时间少8个小时的问题

解决IEfirefox浏览器下JS的new Date()的值为Invalid Date的问题

js问题,Date date=new Date()。我想把"20111231"这个日期值指定到date变量中,怎样操作?