永利402游戏网站

当前位置:永利402游戏网站-永利402com官方网站 > 永利402游戏网站 > 今是昨非Node版本招致的Date构造函数难点及缓和办

今是昨非Node版本招致的Date构造函数难点及缓和办

来源:http://www.xtcsyb.com 作者:永利402游戏网站-永利402com官方网站 时间:2019-11-08 00:29

区别Node版本引致的Date构造函数难点及缓慢解决办法

2018/07/06 · JavaScript · Date

初藳出处: 康建云   

前些天在卷入时直接纳组件的单元测验时,为了组织出Date对象,直接选取了默许Date构造函数。自身本地开辟,测量试验均无难题,push远程后,某些小同伙在地头跑测验用例时,却回天乏术透过,具体报错如下:

图片 1

经过截图音信,能够伊始判别由于Date构造函数重返了区别日期以致,抱着惊叹的姿态查阅个各个质感后,竟然发掘一个小小的的日期构造函数里面不乏,平常自身写起来都是浅尝辄止,未有深切摸底过。下边将详细介绍这一个破案进程,以防各位看客后续覆车继轨。

成立 Date 对象的语法:

难题排查

根据一定做法,出标题后先自个儿本地跑了一遍测验用例,未有其它难点,起始就能够固定是支付遭逢难题。于是乎就看了下小友人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 1993 11:24:00 GMT +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 1994 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构造函数。

复制代码 代码如下:

深深深入分析

构成难题,提炼出以下小示例,以供深刻剖判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 壹玖玖壹 00:00:00 青霉素T+0800 (中黄炎子孙民共和国家标准准时期) > console.log(d2.toString()); Sun Dec 17 1993 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 1992 00:00:00 罗红霉素T+0800 (中华夏儿女民共和国家规范如时期) > console.log(d2.toString()); Sun Dec 17 一九九五 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中提到届时刻的有关专门的工作了。

//Date 对象会自行把当下日子和时间保存为其开端值。
new Date();

连带专门的学问

ISO8601标准[参考5]

该标准钦命了意气风发旦为钦点偏移时间就默以为如今岁月。

图片 2

[ES5 规范][参考6]

提出了若无一点点名偏移量,暗中同意偏移量为Z。

图片 3

[ES6 规范][参考7]

为了和ISO8601标准相像,又对该标准做了改造,假设时区偏移量不真实,日期时间将被分解为本地时间。

图片 4

//value-微秒:代表自世界和睦时一九七零年5月1日00:00:00起来的数值。
new Date(value);

源码深入分析

为了确认该难点是出于不相同专门的学问招致的,大家就必要看下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规范的援助,实现了假如时区偏移量不设有,日期时间将被批注为本土时间的遵守。

图片 5

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

标题总计

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

通过上述标准和源码,低版本由于会加默许偏移量Z,暗许就拆解剖析成0时区的小时,而大家在东八区,所以最终大家地方的时间是1993-12-17T08:00:00,高版本下由于未有Z,暗许会解析开销地时间,输出结果末了正是1994-12-17T00:00:00。

主题素材应用方案便是只须求加上岁月偏移量就能够,如下new Date(‘一九九一-12-17T03:24:00+08:00’)。

//year-年:代表年份的整数值。为了制止二零零四年难点最佳钦命4位数的年度; 使用1999, 而不用用98
//month-月:代表月份的整数值从0(11月卡塔 尔(阿拉伯语:قطر‎到11(八月卡塔 尔(英语:State of Qatar)
//day-日:代表贰个月尾的第几天的卡尺头值,从1先导
//hour-小时:代表黄金时代仲夏的小时数的整数值 (24小时制)
//minute-分钟
//second-秒
//millisecond-毫秒
new Date(year, month, day [, hour, minute, second, millisecond]);

经历教化

鉴于浏览器的差异和不平等,猛烈建议不要 使用Date构造函数解析日期字符串(况兼Date.parse它们是等价的卡塔 尔(阿拉伯语:قطر‎。

尽心竭力使用“YYYY / MM / DD”作为日期字符串,可能利用时间时分秒的构造函数来布局Date对象,他们赢得布满地支持。有了这种格式,所有的小运都以本地的。

唯有您领略本身在做如何,不然请制止接纳带有连字符号的日子(”YYYY-MM-DD”卡塔 尔(英语:State of Qatar),独有较新的浏览器援救它们。

Date()

参考

[1]

[2]

[3]

[4]

[5]

[6]

[7]

1 赞 1 收藏 评论

图片 6

Date() 方法可回到当天的日子和岁月。

复制代码 代码如下:

console.log(Date());  //"Tue Sep 17 二〇一三 12:22:55 螺旋霉素T+0800 (中中原人民共和国家标准依时期)"

parse()

parse() 方法可深入分析叁个日期时间字符串,并赶回 1967/1/1 清晨离开该日期时间的阿秒数。

Date.parse(datestring)

参数datestring是必备的,表示日期和岁月的字符串。

瞩目,该办法是 Date 对象的静态方法。日常接纳 Date.parse() 的格局来调用,实际不是因而 dateobject.parse() 调用该情势。

复制代码 代码如下:

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

UTC()

UTC() 方法可依附世界时重返 一九六九 年 1 月 1 日 到内定日期的微秒数。

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

参数year是十分重要的,表示年份的几位数字;month是不能缺少的,表示月份的平头,介于 0 ~ 11;day是可选的,表示日期的卡尺头,介于 1 ~ 31;hours是可选的,表示时辰的整数,介于 0 ~ 23;minutes是可选的,表示分钟的平头,介于 0 ~ 59;seconds是可选的,表示秒的莫西干发型,介于 0 ~ 59;ms是可选的,表示皮秒的整数,介于 0 ~ 999。

Date.UTC() 是朝气蓬勃种静态方法。Date.UTC() 方法的参数内定日期和时间,它们都是UTC 时间,处于 克拉霉素T 时区。钦定的 UTC 时间将转变到阿秒的款式,那样构造函数 Date() 和方法 Date.setTime() 就足以行使它了。

ECMAScript中的Date类型是最先Java中的Java.util.Date类基本功上营造的。为此,Date类型使用来源UTC(Coordinated Universal Time,国际协和时间)一九七零年十一月1日晚上(零时卡塔尔国开端通过的飞秒数来保存日期。在动用这种数据存款和储蓄格式的法则下,Date类型保存的日期能够正确到1969年10月1日事先或之后的285616年。

潜心:parse()日期和时间都基于本地时区而非卡那霉素T来成立。而UTC()是基于博来霉素T来创建。他们的参数也不相近。

维生霉素T:世界时,即Green尼治所在地的正式时间。

复制代码 代码如下:

var d = new Date();

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

ECMAScript5增多了Data.now()方法,重临表示调用那一个办法时的日期和岁月的微秒数。IE9才起来帮忙,可是大家能够通过

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

复制代码 代码如下:

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

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

JavaScript中的日期调换极其的奇异,不仅仅会因为参数分裂而有分化的解说结果,况且在依次浏览器中的表现也迥然差异,如下:

复制代码 代码如下:

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 GMT+0800 (中中原人民共和国家标准如时期)

在差别浏览器中的表现参谋:

为了防止这么些主题材料,请遵照上边包车型大巴提议:

1.坚称使用 ”YYYY/MM/DD” 的日子字符串格式
2.防止使用含有连字号的日期字符串格式”YYYY-MM-DD”
3.要钦定肆人数的年度
4.Chrome浏览器的比其余浏览器能负责越多的日子字符串,所以若是在Chrome浏览器未有毛病,不代表任何浏览器没不寻常

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

get种类措施

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() 重临 一九六九 年 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)。

set类别措施

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)。

toString种类措施

toString() 把 Date 对象转变为字符串,toString()总是回到三个用中式保加利亚语表明的字符串。
toTimeString() 把 Date 对象的时光部分改动为字符串。
toDateString() 把 Date 对象的日子部分改造为字符串。
toUTCString() 依照世界时,把 Date 对象转变为字符串。
toLocaleString() 办事处方时间格式,把 Date 对象转变为字符串。
toLocaleTimeString() 依据本地时间格式,把 Date 对象的年月部分退换为字符串。
toLocaleDateString() 事务部方时间格式,把 Date 对象的日子部分更改为字符串。

复制代码 代码如下:

var d = new Date();

console.log(d);                      //Tue Sep 17 二〇一一 13:37:04 培洛霉素T+0800 (中中原人民共和国家标准按时间)
console.log(d.toString());           //Tue Sep 17 2011 13:37:04 GMT+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日

注意toLocaleString()类别措施能够收到参数,来鲜明依据什么样习贯来输出,参谋:MDN

复制代码 代码如下:

var d = new Date();

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

你可能感兴趣的篇章:

  • 举一反三JS Date对象时间格式化功用的小例子
  • JavaScript Date对象精解
  • 详细明白JavaScript对Date对象的操作难题(生成三个尾数7天的数组)
  • javascript转变日期字符串为Date日期对象的艺术
  • 浅谈JavaScript中Date(日期对象),Math对象
  • 浅谈JavaScript Date日期和岁月对象
  • JavaScript 中Date对象的格式化代码方法汇总

本文由永利402游戏网站-永利402com官方网站发布于永利402游戏网站,转载请注明出处:今是昨非Node版本招致的Date构造函数难点及缓和办

关键词:

上一篇:Web开发者需知的15个HTML5画布应用

下一篇:没有了