品牌动态

当前位置:新萄京娱乐场手机版 > 品牌动态 > 创办 Date 对象的语法,竟然发现三个比非常小的

创办 Date 对象的语法,竟然发现三个比非常小的

来源:http://www.chrisproduction.com 作者:新萄京娱乐场手机版 时间:2019-10-05 16:47

差异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('1995-12-17T03:24:00') > console.log(defaultDate.toString()) Sun Dec 17 1991 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('1991-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构造函数。

复制代码 代码如下:

深刻分析

结缘难点,提炼出以下小示例,以供深切深入分析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 1993 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 一九九三 00:00:00 GMT+0800 (中夏族民共和国家标准准时间) > console.log(d2.toString()); Sun Dec 17 1991 08:00:00 卡那霉素T+0800 (中夏族民共和国家标准准时间) > console.log(d3.toString()); Sun Dec 17 199108: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-纳秒:代表自世界和煦时一九六五年7月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,就足以表达”壹玖玖伍-12-17T00:00:00″ 在低版本下输出壹玖玖叁-12-17T08:00:00,而高版本下输出一九九二-12-17T00:00:00的标题了。

经过上述规范和源码,低版本由于会加暗许偏移量Z,私下认可就分析成0时区的日子,而小编辈在东八区,所以最后大家地点的光阴是1992-12-17T08:00:00,高版本下由于尚未Z,暗中认可会深入分析开销地时间,输出结果最后就是一九九四-12-17T00:00:00。

标题一举成功方案正是只必要增添岁月偏移量即可,如下new Date(‘一九九三-12-17T03:24:00+08:00’)。

//year-年:代表年份的整数值。为了防止两千年难点最棒钦命4位数的年度; 使用壹玖玖柒, 而不要用98
//month-月:代表月份的整数值从0(四月)到11(3月)
//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”),唯有较新的浏览器协助它们。

Date()

参考

[1]

[2]

[3]

[4]

[5]

[6]

[7]

1 赞 1 收藏 评论

图片 6

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

复制代码 代码如下:

console.log(Date());  //"Tue Sep 17 2012 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() 方法可遵照世界时重临 1967 年 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,国际调养时间)一九六七年3月1日子夜(零时)开端通过的飞秒数来保存日期。在动用这种多少存款和储蓄格式的标准下,Date类型保存的日子能够规范到一九六六年三月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 GMT+0800 (中夏族民共和国家标准准时间)
console.log(d2);  //Tue Mar 13 二〇一三 08:00:00 达托霉素T+0800 (中国标准时间)
console.log(d3);  //Tue Mar 13 二〇一二 00:00:00 螺旋霉素T+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()总是回到四个用中式英文表明的字符串。
to提姆eString() 把 Date 对象的时辰部分退换为字符串。
toDateString() 把 Date 对象的日子部分改动为字符串。
toUTCString() 依照世界时,把 Date 对象调换为字符串。
toLocaleString() 总部面时间格式,把 Date 对象调换为字符串。
toLocale提姆eString() 依据本地时间格式,把 Date 对象的日子有个别改动为字符串。
toLocaleDateString() 遵照本地时间格式,把 Date 对象的日子部分改造为字符串。

复制代码 代码如下:

var d = new Date();

console.log(d);                      //Tue Sep 17 2012 13:37:04 丙胺博莱霉素T+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日

注意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对象的格式化代码方法汇总

本文由新萄京娱乐场手机版发布于品牌动态,转载请注明出处:创办 Date 对象的语法,竟然发现三个比非常小的

关键词:

上一篇:没有了

下一篇:没有了