当前位置:首页 > JavaScript

js new Date() 默认是8点

canca4年前 (2021-11-29)JavaScript822

起因

最近在写一个页面,需要用到时间控制。然后我通过new Date()传入日期字符串创建了一个对象,并与当前时间做时间戳比较,结果12点刚过,就出问题了。举个栗子

// 假设当前时间是2019年12月22日0点20分
new Date('2019-12-22').getTime() < new Date().getTime()
// 上面的结果是什么?正常来说应该是true吧,但不好意思啊,返回了false

百思不得其解,当时因为情况紧急,查出了上面的创建时间返回的内容并不是0点,而是8点

> new Date('2019-12-22').toLocaleString();
<. "2019/12/22 上午8:00:00"

所以就强行在时间字符串上拼接了时间:new Date('2019-12-22 00:00:00').getTime(), 强行解决了这个问题。

然后又碰到了在IOS上不识别中横线分割的时间字符串问题,讲中横线转成了反斜杠。

当时临时解决问题后的字符串大概长这样:

new Date('2019/12/22 00:00:00').getTime() < new Date().getTime()

临时解决问题。现在闲来无事,可以看看这个问题究竟是什么鬼?

尝试

传入不同的字符串格式,看看结果,我只尝试了最常使用的两种格式

> new Date('2019-12-21')
<• Sun Dec 22 2019 08:00:00 GMT+0800(中国标准时间)
> new Date('2019-12-22 00:00:00')
<• Sun Dec 22 2019 00:00:00 GMT+0800(中国标准时间)
> new Date('2019/12/22')
<• Sun Dec 22 2019 00:00:00 GMT+0800(中国标准时间)
> new DateC2019/12/22 00:00:00')
<• Sun Dec 22 2019 00:00:00 GMT+0800(中国标准时间)

惊讶的发现,-分割的字符串,被默认解析到了8点,而/分割的字符串,默认解析到了0点。这么说来,我之前有点多次一举了,直接讲-替换成/就可以了啊。

探究

那么为什么默认是8点呢?有没有觉得8这个数字很值得关注,我们所在的时区是东八区,如果以GMT标准0点来算的话,在那个时间点,这里就是8点啊。

那我就可以这样理解了,创建时间时,它默认时间确实是0点,但是是以GMT为基准的,所以将其转换成本地时间就是8点。而/分割的字符串在创建时,则是以本地时区为基准。

那么为什么js会对不同分割的时间字符串进行不同处理呢?貌似是因为-分隔且具有前导0的日期字符串,会被解析成ISO格式的字符串,以GMT时区为基准,不过我也没看懂。

解决

最终,既然-分割的字符串会出问题,那我就讲所有的-都换成/就好了,正好也可以借此解决IOS的兼容问题。

动手解决:

/**
 * 将时间字符串转换成date对象
 * @param dateStr
 * 时间字符串
 */function getDate(dateStr){
    /* 若日期是使用-分割的,全部转换成/
            因为只有日期时,js会将-分割的字符串基准时区设置为GMT,与当前时区相差8小时 */
    dateStr = dateStr.replace(/-/g, '/');
    return new Date(dateStr);}


扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/790.html

标签: jsdate
分享给朋友:

“js new Date() 默认是8点” 的相关文章

JavaScript 函数原型对象

    以下是一篇本人在Qzone里写下的文章,现在放到这里来,欠丑了。希望对一些初学者有一点点帮助。     今天给大家说说JavaScript中的类。类?没错。JavaScript中的函数原型对象就是OOP中人们熟悉的类。..…

javascript IE与FireFox 一些兼容写法

1>获取控件用document.getElementById,不用document.all(FF等浏览器不支持)2><button> 会被firefox解释为提交form或者刷新页面,需要写标准<button type="button">3>使用childN…

javascrip 事件追加方法

基本方法:attachEvent(IE)/detachEvent;addEventListener( Mozilla, Netscape, Firefox)/removeEventListener在之前的邏輯判斷式的基礎上,在設計javascript的時候,可以針對瀏覽器的不同,寫出適合不同種類瀏覽…

event事件兼容mozilla firefox的问题

本来一个写好了的脚本在IE下正常,可是在mozilla firefox中我们发现程序报类似如下的错误: event is not defined obj has no properties 原因是Firefox中使用了不同的事件对象模型,不同于IE Dom,用的是W3C Dom. 下是我在网上找到的…

常用javascirpt脚本

1.让文字不停地滚动 <MARQUEE>滚动文字</MARQUEE> 2.记录并显示网页的最后修改时间 <script language=javascript> document.write("最后更新时间: " + document.lastModified + "")…

firefox event.srcElement

event.srcElement从字面上可以看出来有以下关键字:事件,源 他的意思就是:当前事件的源, 我们可以调用他的各种属性 就像:document.getElementById(”")这样的功能, 经常有人问 firefox 下的 event.srcElement 怎么用,在此详细说明: IE…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。