澳门太阳娱乐集团官网-太阳集团太阳娱乐登录

不等Node版本导致的Date构造函数难题及化解方式
分类:网页制作

不等Node版本导致的Date构造函数难点及消除措施

2018/07/06 · JavaScript · Date

原稿出处: 康建云   

不久前在包装时间选拔组件的单元测验时,为了协会出Date对象,直接运用了暗中认可Date构造函数。自身本地开拓,测量检验均无难题,push远程后,有个别小友人在地点跑测量检验用例时,却无法通过,具体报错如下:

澳门太阳娱乐集团官网 1

透过截图音讯,能够开端推断由于Date构造函数再次回到了分化日期导致,抱着惊讶的神态查阅个各个资料后,竟然发掘八个小小的日子构造函数里面不乏,平日温馨写起来都以一噎止餐,没有尖锐精晓过。上边将详细介绍那一个破案进程,防止各位看客后续重蹈覆辙。

那是近年四个月写得最完美的创作了,用JS实现了二个拖拽排序,效果图如下:
澳门太阳娱乐集团官网 2
一起首进入项目有了这么的拖拽完毕主见,一点线索未有,请老师兄说那样实现不容许。那时以为很可惜,妄想用古板的办法去贯彻。正思虑守旧的办法,感到日子丰盛,就回来了拖拽的主见上来。终于达成了。其实本人不是绚烂这一个(当然,感兴趣的话,能够QQ907087894牵连笔者,笔者会收拾德姆o上传到财富宗旨),小编想说的是下文。
就在小编实现的还要,师姐帮另三个友人写了一个理念方案的德姆o,他开展的是修改的排序。在他机器上演示的时候,那时候就感觉很感动,在他的鼠标滑动下,走马看花了叁遍代码,望着长长的链式JS,顿生爱慕。那时候就想,等等级次序结了,好好钻研他那个。
澳门太阳娱乐集团官网 3
2个月后,等来了,闲暇。缘于对JS的不熟悉,很费劲的勉强看懂了代码,运维的时候,飞来了贰头昆虫。移动的时候,一向提醒无接纳项。

自家用过的三个本子:

标题排查

根据一定做法,出难题后先本身当地跑了一遍测量检验用例,未有别的难点,伊始就足以一定是付出条件难题。于是乎就看了下小同伙nodejs版本号,版本号为6.10.0,而友好本地node版本号为10.3.0,于是在差异nodejs命令行下直接实行如下测验用例。

JavaScript

const defaultDate = new Date('1995-12-17T03:24:00'); console.log(defaultDate.toString());

1
2
3
const defaultDate = new Date('1995-12-17T03:24:00');
 
console.log(defaultDate.toString());

实践结果,

Node 6.10.0:

JavaScript

> const defaultDate = new Date('1992-12-17T03:24:00') > console.log(defaultDate.toString()) Sun Dec 17 壹玖玖叁 11:24:00 克拉霉素T +0800(中国家标准准时间)

1
2
3
4
> const defaultDate = new Date('1995-12-17T03:24:00')
> console.log(defaultDate.toString())
 
Sun Dec 17 1995 11:24:00 GMT +0800(中国标准时间)

Node 10.3.0:

JavaScript

const defaultDate = new Date('一九九三-12-17T03:24:00') undefined console.log(defaultDatae.toString()) Sun Dec 17 一九九四 03:24:00 GMT+0800 (中中原人民共和国家规范准时间)

1
2
3
4
const defaultDate = new Date('1995-12-17T03:24:00')
undefined
console.log(defaultDatae.toString())
Sun Dec 17 1995 03:24:00 GMT+0800 (中国标准时间)

到此基本确认了该难题是由Nodejs意况导致的标题。可是为啥会有那般的难点吗,跟着笔者延续深远探秘下Date构造函数。

复制代码 代码如下:

v0.5.2-dev,0.4.5

深切分析

重组难点,提炼出以下小示例,以供浓密剖析Date构造函数:

JavaScript

var d1 = new Date("1995/12/17 00:00:00"); var d2 = new Date("1995-12-17T00:00:00"); var d3 = new Date("1995-12-17T00:00:00Z"); console.log(d1.toString()); console.log(d2.toString()); console.log(d3.toString());

1
2
3
4
5
6
var d1 = new Date("1995/12/17 00:00:00");  
var d2 = new Date("1995-12-17T00:00:00");
var d3 = new Date("1995-12-17T00:00:00Z");
console.log(d1.toString());
console.log(d2.toString());
console.log(d3.toString());

nodejs 10.3.0推行结果:

JavaScript

> console.log(d1.toString()); Sun Dec 17 1992 00:00:00 金霉素T+0800 (中中原人民共和国家标准准时间) > console.log(d2.toString()); Sun Dec 17 一九九三 00:00:00 地霉素T+0800 (中中原人民共和国家规范准时间) > console.log(d3.toString()); Sun Dec 17 一九九一08:00:00 丙胺搏来霉素T+0800 (中夏族民共和国家标准准时间)

1
2
3
4
5
6
> console.log(d1.toString());
Sun Dec 17 1995 00:00:00 GMT+0800 (中国标准时间)
> console.log(d2.toString());
Sun Dec 17 1995 00:00:00 GMT+0800 (中国标准时间)
> console.log(d3.toString());
Sun Dec 17 1995 08:00:00 GMT+0800 (中国标准时间)

nodejs 6.10.0实施结果:

JavaScript

> console.log(d1.toString()); Sun Dec 17 壹玖玖壹 00:00:00 阿奇霉素T+0800 (中华夏族民共和国标准时间) > console.log(d2.toString()); Sun Dec 17 1992 08:00:00 克拉霉素T+0800 (中中原人民共和国家规范准时间) > console.log(d3.toString()); Sun Dec 17 一九九一08:00:00 地霉素T+0800 (中夏族民共和国家规范准时间)

1
2
3
4
5
6
> console.log(d1.toString());
Sun Dec 17 1995 00:00:00 GMT+0800 (中国标准时间)
> console.log(d2.toString());
Sun Dec 17 1995 08:00:00 GMT+0800 (中国标准时间)
> console.log(d3.toString());
Sun Dec 17 1995 08:00:00 GMT+0800 (中国标准时间)

缘何在不相同条件下Nodejs的剖判行为不等同吗?那就要提下JS中关系到时刻的相关标准了。

for(var j = 0; j < div_count; j++){ 
澳门太阳娱乐集团官网,            if(($("#eva_div_all").children().eq(j).children().children().eq(0).attr('checked'))=='checked'){ 
                var valid_checked = $("#eva_div_all").children().eq(j).children().children().eq(0).attr('id'); 
                if(valid_checked==checked_name){alert(alert_des);return;} 
                /* 对调 */ 
                var temp = $("#eva_div_all").children().eq(j).attr('id'); 
                var temp_html = $("#"+temp).html(); 
                var before_temp = $("#eva_div_all").children().eq(j+num).attr('id'); 
                var before_temp_html = $("#"+before_temp).html(); 
                $("#"+temp).html(''); 
                $("#"+before_temp).html(''); 
                $("#"+temp).html(before_temp_html); 
                $("#"+before_temp).html(temp_html); 
                checked = 'true'; 
                new_order(); 
            } 
        } 
        if(checked=='false'){ 
            alert('无接纳项!!'); 
        }

那边针对于付出方法进行验证一下,如下代码:

连带规范

ISO8601标准[参考5]

该标准钦命了一旦为钦点偏移时间就默感觉眼明天子。

澳门太阳娱乐集团官网 4

[ES5 规范][参考6]

建议了若无一点点名偏移量,暗中认可偏移量为Z。

澳门太阳娱乐集团官网 5

[ES6 规范][参考7]

为了和ISO8601标准一致,又对该规范做了改换,如若时区偏移量不设有,日期时间将被分解为本土时间。

澳门太阳娱乐集团官网 6

恰如飞虫进入了眼睛,不断的揉啊揉,即是出不来,一天正是那般过的。
不得已了,解铃还需系铃人,她来了,调节和测量试验了长时间旷日漫长,还不是老大,后来对照她本地的代码,毫无差异,她本地也运转如常。后来大家就高达了共同的认知浏览器难点。

<script>
$(function () {
$("#addUserForm").bootstrapValidator({
submitHandler: function(validator, form, submitButton) {
// 版本号0.4.5支持
// 版本号v0.5.2-dev不再支持submitHandler配置
}
}).on("success.form.bv",function(e){
// 版本号0.4.5支持
// 版本号v0.5.2-dev支持
});
</script>

源码剖析

为了确认该难点是出于分歧专门的学业导致的,我们就必要看下V8源码里面包车型大巴贯彻了。 获取区别node版本对应的v8版本号,如下图所示:

JavaScript

//node 10.3.0 > process.versions.v8 '6.6.346.32-node.9' //node 6.10.0 > process.versions.v8 '5.1.281.93'

1
2
3
4
5
6
7
//node 10.3.0
> process.versions.v8
'6.6.346.32-node.9'
 
//node 6.10.0
> process.versions.v8
'5.1.281.93'

翻看 v8 的比不上版本下git提交记录可知到在6.6版本桃浪经扩展了对ES6规范的协助,达成了假如时区偏移量不真实,日期时间将被解说为本地时间的功效。

澳门太阳娱乐集团官网 7

复制代码 代码如下:

如上所述是小编给我们介绍的BootStrap Validator 版本差距难点导致的submitHandler失效难点的消除方法,希望对我们具备利于,如若大家有别的疑问请给自家留言,作者会及时过来我们的。在此也特别感激大家对台本之家网址的帮衬!

标题总计

回头看文章开头的用的日子构造函数导致的bug,就可以解释”1992-12-17T00:00:00″ 在低版本下输出1992-12-17T08:00:00,而高版本下输出一九九二-12-17T00:00:00的主题素材了。

通过上述规范和源码,低版本由于会加暗许偏移量Z,默许就分析成0时区的时刻,而大家在东八区,所以最终大家地点的时日是一九九四-12-17T08:00:00,高版本下由于未有Z,暗中认可会分析开支地时间,输出结果最终正是1991-12-17T00:00:00。

主题材料一蹴即至方案就是只须求加上岁月偏移量就可以,如下new Date(‘壹玖玖贰-12-17T03:24:00+08:00’)。

$("#eva_div_all").children().eq(j).children().children().eq(0).attr('checked'))=='checked')

您或然感兴趣的小说:

  • Bootstrapvalidator校验、校验清除重新设置的落实代码(推荐)
  • 应用bootstrap validator的remote验证代码经验分享(推荐)
  • 实用又能够的BootstrapValidator表单验证插件
  • JS组件Form表单验证神器BootstrapValidator
  • 依据jQuery 完毕bootstrapValidator下的大局验证

经验教训

鉴于浏览器的反差和不平等,猛烈提出不要 使用Date构造函数解析日期字符串(况兼Date.parse它们是等价的)。

全力以赴选拔“YYYY / MM / DD”作为日期字符串,恐怕选择时间时分秒的构造函数来布局Date对象,他们获得广大地支撑。有了这种格式,全部的年月都以本土的。

除非您领略自个儿在做什么样,不然请防止选用带有连字符号的日期(”YYYY-MM-DD”),独有较新的浏览器帮助它们。

浏览器对ehecked属性帮助分化。  

参考

[1]

[2]

[3]

[4]

[5]

[6]

[7]

1 赞 1 收藏 评论

澳门太阳娱乐集团官网 8

他是firefox 23, 小编的是16.0.1。很欢腾,终算找到题指标关键了,那件事到底告一段落。
澳门太阳娱乐集团官网 9
一个星期后的前几日,用同样的浏览器采访服务器上的能源,又官样文章那么些标题了。接着商量吗。
辛亏,不知道哪来的灵感,把原引入的jquery.js换成jquery-1.7.2.min.js,难点总算重新被消除。
不明了还只怕会不会在被推翻,呵呵~~

你也许感兴趣的文章:

  • 消除jquery版本冲突的有效性形式
  • jQuery版本进级踩坑大全
  • 选择jQuery判定IE浏览器版本的代码
  • 五个jQuery版本共存的管理方案
  • jquery1.9 下检查评定浏览器类型和版本的章程
  • 用jQuery完毕检查实验浏览器及版本的本子代码
  • jQuery1.4.2与老版本json格式宽容的消除措施
  • jQuery八个版本和其余js库冲突的解决办法
  • 据悉jQuery1.9本子怎么着判别浏览器版本类型
  • 何以接纳jQuery版本 1.x? 2.x? 3.x?

本文由澳门太阳娱乐集团官网发布于网页制作,转载请注明出处:不等Node版本导致的Date构造函数难题及化解方式

上一篇:开卷小说《网页设计那几个事》 下一篇:JavaScript 浓密之创造对象的有余艺术以及优劣点
猜你喜欢
热门排行
精彩图文