永利皇宫402不同Node版本导致的Date构造函数问题及解决方法,JavaScript原生对象之Date对象的属性和方法详解

永利皇宫402 6
永利皇宫402

深切分析

构成难题,提炼出以下小示例,以供深切分析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 1991 00:00:00 克拉霉素T+0800
(中黄炎子孙民共和国家规范准期间) > console.log(d2.toString()); Sun Dec 17 1991 00:00:00
放线菌壮观素T+0800 (中国家标准依时期) > console.log(d3.toString()); Sun Dec 17 199408:00:00 GMT+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 1991 00:00:00 克林霉素T+0800
(中夏族民共和国家规范如时期) > console.log(d2.toString()); Sun Dec 17 1994 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中关系届期间的相关规范了。

var d = new Date();

源码解析

为了确认该难点是出于分裂专门的学业招致的,我们就须求看下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标准的援助,完毕了假若时区偏移量不设有,日期时间将被讲解为本地时间的职能。

永利皇宫402 1

var d = new Date();

经历训诫

鉴于浏览器的差异和不相符,生硬提议不要
使用Date构造函数剖析日期字符串(何况Date.parse它们是等价的卡塔 尔(英语:State of Qatar)。

不遗余力使用“YYYY / MM /
DD”作为日期字符串,可能应用时间时分秒的构造函数来布局Date对象,他们拿到广泛地帮忙。有了这种格式,全体的小时都是地方的。

只有你通晓本人在做如何,不然请幸免使用含有连字符号的日子(”YYYY-MM-DD”卡塔 尔(阿拉伯语:قطر‎,只有较新的浏览器扶助它们。

console.log(d.toLocaleString(“ko-KR”));  //2013년 9월 17일 오후
1:48:24

标题总计

回头看小说最早的用的日期构造函数导致的bug,就足以降解”1992-12-17T00:00:00″
在低版本下输出一九九四-12-17T08:00:00,而高版本下输出一九九一-12-17T00:00:00的主题材料了。

由此上述标准和源码,低版本由于会加默许偏移量Z,暗中认可就解析成0时区的日子,而小编辈在东八区,所以末了我们本地的光阴是1995-12-17T08:00:00,高版本下由于还没Z,私下认可会深入解析费用地时间,输出结果最终正是一九九五-12-17T00:00:00。

标题化解方案正是只须要增多岁月偏移量就能够,如下new
Date(‘一九九一-12-17T03:24:00+08:00’)。

Date() 方法可回到当天的日期和时间。

不等Node版本引致的Date构造函数难点及缓慢解决方式

2018/07/06 · JavaScript
· Date

原稿出处:
康建云   

明天在包装时间接选举择组件的单元测量试验时,为了组织出Date对象,直接利用了私下认可Date构造函数。自身本地开采,测量检验均无难题,push远程后,有些小朋侪在地面跑测量试验用例时,却心有余而力不足通过,具体报错如下:

永利皇宫402 2

通过截图消息,能够初步判定由于Date构造函数再次来到了不一样日期招致,抱着惊恐的态度查阅个各类材质后,竟然开采几个小小的的日期构造函数里面不乏,日常和好写起来都以一曝十寒,未有深入摸底过。下边将详细介绍那几个破案进程,以防各位看客后续重蹈覆辙。

阿奇霉素T:世界时,即Green尼治所在地的专门的学业时间。

连带标准

ISO8601标准[参考5]

该规范钦定了生机勃勃旦为内定偏移时间就默以为当前时光。

永利皇宫402 3

[ES5 规范][参考6]

提议了生龙活虎旦没有一点点名偏移量,暗许偏移量为Z。

永利皇宫402 4

[ES6 规范][参考7]

为了和ISO8601标准大器晚成致,又对该标准做了改造,假使时区偏移量不设有,日期时间将被解说为本土时间。

永利皇宫402 5

toString种类措施

主题素材各种核查

依照一定做法,出难题后先自身本地跑了一遍测验用例,未有其他难题,开首就足以一定是付出条件难点。于是乎就看了下小友人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(‘1993-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(‘1993-12-17T03:24:00’) undefined
console.log(defaultDatae.toString()) Sun Dec 17 1993 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构造函数。

var d = new Date();

参考

[1]

[2]

[3]

[4]

[5]

[6]

[7]

1 赞 1 收藏
评论

永利皇宫402 6

//value-飞秒:代表自世界和煦时一九六八年九月1日00:00:00始发的数值。
new Date(value);

当心,该方式是 Date 对象的静态方法。经常选择 Date.parse()
的方式来调用,并非经过 dateobject.parse() 调用该措施。

Date.UTC() 是生龙活虎种静态方法。Date.UTC() 方法的参数钦命日期和岁月,它们都以UTC 时间,处于 林大霉素T 时区。内定的 UTC 时间将转变到皮秒的样式,那样构造函数
Date() 和办法 Date.setTime() 就可以使用它了。

更加的多音信方可参见:JavaScript and Dates, What a
Mess!和
SO中的座谈

ECMAScript5加多了Data.now()方法,再次来到表示调用这几个办法时的日期和时间的飞秒数。IE9才起来协助,可是大家能够通过

为了幸免这个难题,请根据上边包车型地铁提出:

复制代码 代码如下:

//Date 对象会自行把当下日子和岁月保存为其发轫值。
new Date();

成立 Date 对象的语法:

console.log(Date.parse(Date()));        //1379392301000
console.log(Date.parse(“Aug 9, 1995”)); //807897600000

UTC()

ECMAScript中的Date类型是早先时期Java中的Java.util.Date类基本功上构建的。为此,Date类型使用来源UTC(Coordinated
Universal
Time,国际和睦时间)1969年三月1日清晨(零时卡塔 尔(英语:State of Qatar)开头通过的微秒数来保存日期。在应用这种数据存款和储蓄格式的规范下,Date类型保存的日期能够正确到1968年11月1日此前或之后的285616年。

Date.UTC(year, month, day, hours, minutes, seconds, ms)

//dateString-日期字符串:表示日期的字符串值。此字符串应该是在parse方法中分辨的格式。
new Date(dateString);

console.log(Date());  //”Tue Sep 17 二〇一二 12:22:55 红霉素T+0800
(中华夏儿女民共和国家规范准时期)”

JavaScript中的日期转变特别的稀奇奇怪,不止会因为参数差别而有分裂的批注结果,何况在种种浏览器中的展现也迥然分歧,如下:

//year-年:代表年份的整数值。为了制止二零零零年主题材料最棒内定4位数的年度;
使用1996, 而实际不是用98
//month-月:代表月份的整数值从0(二月卡塔尔到11(11月卡塔 尔(英语:State of Qatar)
//day-日:代表三个月首的第几天的整数值,从1伊始
//hour-小时:代表大器晚成仲夏的时辰数的整数值 (24小时制)
//minute-分钟
//second-秒
//millisecond-毫秒
new Date(year, month, day [, hour, minute, second, millisecond]);

set类别措施

复制代码 代码如下:

复制代码 代码如下:

只顾toLocaleString()种类措施能够接纳参数,来规定遵照什么习于旧贯来输出,参照他事他说加以考察:MDN

parse()

参数datestring是少不了的,表示日期和时间的字符串。

var d1 = new Date(“2012/03/13”);
var d2 = new Date(“2012-03-13”);
var d3 = new Date(“2012-3-13”);

console.log(d1);  //Tue Mar 13 二零一一 00:00:00 丙胺博莱霉素T+0800 (中中原人民共和国家标准准时间)
console.log(d2);  //Tue Mar 13 二〇一三 08:00:00 威他霉素T+0800 (中中原人民共和国家标准准时期)
console.log(d3);  //Tue Mar 13 二〇一三 00:00:00 克拉霉素T+0800 (中华夏儿女民共和国家规范准时期)

var d1 = Date.now();
var d2 = + new Date();

parse() 方法可剖判二个日龙时间字符串,并回到 一九六九/1/1
上午偏离该日期时间的纳秒数。

toString() 把 Date
对象转变为字符串,toString()总是回到一个用中式克罗地亚共和国语表明的字符串。
toTimeString() 把 Date 对象的年华部分改换为字符串。
toDateString() 把 Date 对象的日子部分改变为字符串。
toUTCString() 依照世界时,把 Date 对象调换为字符串。
toLocaleString() 事务部方时间格式,把 Date 对象转变为字符串。
toLocaleTimeString() 总局方时间格式,把 Date
对象的时间有个别改变为字符串。
toLocaleDateString() 总局方时间格式,把 Date
对象的日子部分退换为字符串。

在区别浏览器中的表现参照他事他说加以考察:

console.log(d1);  //1379393793104
console.log(d2);  //1379393793104

console.log(d);                      //Tue Sep 17 二零一一 13:37:04 GMT+0800
(中华夏族民共和国家规范定时期)
console.log(d.toString());           //Tue Sep 17 二零一三 13:37:04 螺旋霉素T+0800
(中夏族民共和国标准时间)
console.log(d.toTimeString());       //13:37:04 维生霉素T+0800
(中中原人民共和国标定期期)
console.log(d.toDateString() );      //Tue Sep 17 2013
console.log(d.toUTCString());        //Tue, 17 Sep 2013 05:37:04 GMT
console.log(d.toLocaleString());     //2013年9月17日 下午1:37:04
console.log(d.toLocaleTimeString()); //下午1:37:04
console.log(d.toLocaleDateString()); //2013年9月17日

复制代码 代码如下:

复制代码 代码如下:

Date()

您大概感兴趣的稿子:

  • 推而广之JS
    Date对象时间格式化功效的小例子
  • JavaScript Date对象精解
  • 详细明白JavaScript对Date对象的操作难点(生成八个尾数7天的数组)
  • javascript调换日期字符串为Date日期对象的措施
  • 浅谈JavaScript中Date(日期对象),Math对象
  • 浅谈JavaScript
    Date日期和时间对象
  • JavaScript
    中Date对象的格式化代码方法汇总

Date.parse(datestring)

复制代码 代码如下:

  • 操作符来把Data对象调换到字符串,得到平等的值。

get连串措施

1.坚定不移使用 ”YYYY/MM/DD” 的日子字符串格式
2.制止采取带有连字号的日期字符串格式”YYYY-MM-DD”
3.要钦命二位数的年度
4.Chrome浏览器的比其余浏览器能经受越多的日子字符串,所以只要在Chrome浏览器没有毛病,不意味任何浏览器没极度

复制代码 代码如下:

UTC() 方法可依附世界时重返 一九七〇 年 1 月 1 日 到钦赐日期的飞秒数。

参数year是必备的,表示年份的几个人数字;month是供给的,表示月份的大背头,介于
0 ~ 11;day是可选的,表示日期的整数,介于 1 ~
31;hours是可选的,表示时辰的整数,介于 0 ~
23;minutes是可选的,表示分钟的大背头,介于 0 ~
59;seconds是可选的,表示秒的卡尺头,介于 0 ~
59;ms是可选的,表示阿秒的整数,介于 0 ~ 999。

setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date
对象中的年份(三位数字卡塔尔。注意不要接受setYear()方法。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的分钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的飞秒 (0 ~ 999)。
setTime() 以微秒设置 Date 对象。
setUTCDate() 依据世界时设置 Date 对象中月份的一天 (1 ~ 31)。
setUTCMonth() 依照世界时设置 Date 对象中的月份 (0 ~ 11)。
setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字卡塔尔国。
setUTCHours() 依据世界时设置 Date 对象中的时辰 (0 ~ 23)。
setUTCMinutes() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)。
setUTCSeconds() 依据世界时设置 Date 对象中的秒钟 (0 ~ 59)。
setUTCMilliseconds() 依据世界时设置 Date 对象中的微秒 (0 ~ 999)。

getDate() 从 Date 对象回到二个月底的某一天 (1 ~ 31)。
getDay() 从 Date 对象回到一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象回来月份 (0 ~ 11)。
getFullYear() 从 Date 对象以几位数字重回年份。注意不要采取getYear()。
getHours() 重返 Date 对象的时辰 (0 ~ 23)。
getMinutes() 再次来到 Date 对象的分钟 (0 ~ 59)。
getSeconds() 再次回到 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 再次来到 Date 对象的飞秒(0 ~ 999)。
getTime() 重临 1966 年 1 月 1 日至今的纳秒数。
getTimezoneOffset() 重回本地时间与Green威治标定期期 (克拉霉素T) 的分钟差。
getUTCDate() 根据世界时从 Date 对象再次回到月首的一天 (1 ~ 31)。
getUTCDay() 依照世界时从 Date 对象回到周中的一天 (0 ~ 6)。
getUTCMonth() 依照世界时从 Date 对象回来月份 (0 ~ 11)。
getUTCFullYear() 遵照世界时从 Date 对象回到四个人数的年份。
getUTCHours() 依据世界时重临 Date 对象的钟点 (0 ~ 23)。
getUTCMinutes() 根据世界时重返 Date 对象的分钟 (0 ~ 59)。
getUTCSeconds() 根据世界时再次来到 Date 对象的分钟 (0 ~ 59)。
getUTCMilliseconds() 遵照世界时重回 Date 对象的皮秒(0 ~ 999)。

复制代码 代码如下:

专一:parse()日期和岁月都基于本地时区而非螺旋霉素T来创制。而UTC()是依赖丙胺搏来霉素T来创立。他们的参数也不相似。

console.log(Date.parse(d));  //1379393562000
console.log(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(),
d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds())); 
//1379422362020

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图