【新葡萄娱乐在线网站】JS引用类型之Date和RegExp,JS原生Date类型方法的一些冷知识

JS原生Date类型方法的有个别冷知识

2015/09/07 · JavaScript
· 新葡萄娱乐在线网站,Date

原著出处:
chitanda   

三个多月没更新了-
-偷懒中。那一个事物其实很早从前就在重新整建了,不过新兴发现本人不少地点没弄精通,然后就径直卡那边了(其实就是不想写啊),想了下反正是给协调熟习js的原生API而已,所以也没须求太钻牛角尖,也不自然要多完整,因而就当是Date()【新葡萄娱乐在线网站】JS引用类型之Date和RegExp,JS原生Date类型方法的一些冷知识。函数的二个冷门知识点小补充吧。那篇小说首要讲Date()的字符串与时光戳转换以及用户时间本地化,恐怕内容上相比较乱(不然也不会卡作者3个月时间了),见谅

ps:由于 Date() 是js原生函数,分化浏览器的解析器对其落到实处际景况势并分裂,所以重临值也会有所差异。本文测试未尤其表达浏览器的情景下,均是指
win7 x64+chrome 4四.0.2403.15五(正式版本) m (三10位) 版本

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9             
10             var now=Date.parse('May 8,2017');
11             console.log("日期的毫秒数:"+now);
12             
13             //Date.UTC():也可以获得时间的毫秒数,但是里面的参数不同(May 8,2017)是代表2017年5月8号,月份的基数是0
14             var utc=Date.UTC(2017,3,8);
15             console.log("utc时间毫秒数:"+utc);
16             
17             //new Date(); 返回当天的日期和时间。 
18             var time1=new Date();
19             console.log("当天的日期和时间:"+time1);
20             
21             //根据本地时间把 Date对象转换为字符串,并返回结果。
22             var time2=time1.toLocaleString();
23             console.log("本地时间把 Date对象转换为字符串:"+time2);
24             
25             //把 Date对象转换为字符串,并返回结果。
26             var time3=time1.toString();
27             console.log("Date对象转换为字符串:"+time3);
28             
29             //返回 Date 对象的原始值。
30             var time4=time1.valueOf();
31             console.log("Date对象的原始值:"+time4);
32             
33             //把 Date 对象的日期部分转换为字符串,并返回结果。
34             var time5=time1.toDateString();
35             console.log("Date对象的日期部分:"+time5);
36             
37             //把 Date对象的时间部分转换为字符串,并返回结果。
38             var time6=time1.toTimeString();
39             console.log("Date对象的时间部分:"+time6);
40             
41             //根据本地时间把 Date 对象的日期部分转换为字符串,并返回结果。
42             var time7=time1.toLocaleDateString();
43             console.log("本地时间的日期部分:"+time7);
44             
45             //根据本地时间把 Date 对象的时间部分转换为字符串,并返回结果。
46             var time8=time1.toLocaleTimeString();
47             console.log("本地时间的时间部分:"+time8);
48             
49             //根据世界时 (UTC) 把 Date 对象转换为字符串,并返回结果。
50             var time9=time1.toUTCString();
51             console.log("世界时间UTC:"+time9);
52             
53             //返回指定的日期和时间距 1970 年 1 月 1 日午夜(GMT 时间)之间的毫秒数。
54             var time10=time1.getTime();     
55             console.log("时间距离毫秒数:"+time10);
56             
57             //返回一个表示年份的 4 位数字。
58             var time11=time1.getFullYear();    
59             console.log("年:"+time11);
60             
61             //返回月份字段,使用本地时间。返回值是 0(一月) 到 11(十二月) 之间的一个整数。
62             var time12=time1.getMonth();     
63             console.log("月份:"+time12);
64             
65             //返回月份中的某一天,使用本地时间。返回值是 1 ~ 31 之间的一个整数。
66             var time13=time1.getDate();
67             console.log("日期:"+3);
68             
69             //dateObject.getDay() dateObject 所指的星期中的某一天,使用本地时间。返回值是 0(周日) 到 6(周六) 之间的一个整数。
70             var time14=time1.getDay();
71             console.log("星期:"+time14);
72             
73             //getHours()返回时间的小时字段。
74             var time15=time1.getHours();
75             console.log("小时:"+time15);
76             
77             //getHours()返回时间的分钟字段。
78             var time16=time1.getMinutes();
79             console.log("分钟:"+time16);
80             
81             //getHours()返回时间的秒钟字段。
82             var time17=time1.getSeconds(); 
83             console.log("秒钟:"+time17);
84 
85         </script>
86     </body>
87 </html>

ECMAScript中的Date类型是在早期Java.util.Date类的功底上创设的。为此,Date类型使用自UTC(Coordinated
Universal
Time,国际调和时间)壹玖陆捌年10月二三十日子夜零时初始通过的飞秒数来保存日期。在动用那种数据存款和储蓄格式下,Date类保存的日子能够精确到一玖陆七年4月七日在此以前或以往的100
000 000年。

Date类型


Date类型使用自UTC1967年6月1二十三日零点起来通过的飞秒数来保存日期。
要成立一个日子对象,使用new操作符和Date构造函数即可:

var now = new Date();
  • 在调用Date构造函数不传递参数的情形下,再次来到当前天期

新葡萄娱乐在线网站 1

不传递参数

  • 传送钦命皮秒数,重回从UTC1966年3月2十五日零点启幕通过的皮秒数

新葡萄娱乐在线网站 2

Date()与new Date()的区别

Date() 间接回到当前光阴字符串,任由参数是number照旧其余string

JavaScript

Date(); Date(‘sssss’); Date(1000); //Fri Aug 二一 20一五 一伍:肆陆:2一 维生霉素T+0800
(中夏族民共和国家标准准时间)

1
2
3
4
Date();
Date(‘sssss’);
Date(1000);
//Fri Aug 21 2015 15:46:21 GMT+0800 (中国标准时间)

而 new Date() 则是会遵照参数来回到对应的值,无参数的时候,重回当前岁月的字符串格局;有参数的时候回来参数所对应时间的字符串。
new Date() 对参数不管是格式依旧内容都必要,且只回去字符串,

JavaScript

new Date(); //Fri Aug 二一 贰零1四 一五:5壹:5伍 威斯他霉素T+0800 (中国家标准准时间) new
Date(129387玖陆仟00); new Date(‘2011-01-0一T11:00:00’) new
Date(‘2011/01/0一 1一:00:00’) new Date(201一,0,1,1一,0,0) new Date(‘jan 01
201一,1壹 11:00:00’) new Date(‘Sat Jan 0一 2011 1一:00:00’) //Sat Jan 01
201一 1①:00:00 罗红霉素T+0800 (中夏族民共和国专业时间) new Date(‘sss’); new
Date(‘二〇一三/01/0一T1一:00:00’); new Date(‘201一-0一-01-1壹:00:00’) new
Date(‘129387九五千00’); //Invalid Date new
Date(‘201壹-0壹-01T11:00:00’)-new Date(‘1995/02/11 1二:00:1二’)
//59606998七千

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
new Date();
//Fri Aug 21 2015 15:51:55 GMT+0800 (中国标准时间)
 
new Date(1293879600000);
new Date(‘2011-01-01T11:00:00’)
new Date(‘2011/01/01 11:00:00’)
new Date(2011,0,1,11,0,0)
new Date(‘jan 01 2011,11 11:00:00’)
new Date(‘Sat Jan 01 2011 11:00:00’)
//Sat Jan 01 2011 11:00:00 GMT+0800 (中国标准时间)
 
new Date(‘sss’);
new Date(‘2011/01/01T11:00:00’);
new Date(‘2011-01-01-11:00:00’)
new Date(‘1293879600000’);
//Invalid Date
 
new Date(‘2011-01-01T11:00:00’)-new Date(‘1992/02/11 12:00:12’)
//596069988000

从地点多少个测试结果能够很不难发觉

  1. new Date() 在参数正常的情状只会回去当前时光的字符串(且是眼下时区的日子)
  2. new Date() 在分析多个具体的命宫的时候,对参数有较严峻的格式供给,格式不科学的时候会一向回到Invalid Date,比如将
    number 类的时日戳转换到 string 类的时候也会招致解析出错
  3. 即使 new Date() 的重临值是字符串,可是三个new Date() 的结果字符串是可以直接相减的,结果为距离的皮秒数。

那么, new Date() 能接受的参数格式到底是如何正儿8经呢?(绝对于严谨供给的多参数字传送值方法。非严俊的单参数(数字日期表示格式)更常用且更易于失误,所以下文只考虑单参数数字时间字符串转换的情状)

意味着格式)更常用且更易于失误,所以下文只考虑单参数数字时间字符串转换的情形)


新葡萄娱乐在线网站 3

要开创三个日期对象,使用new操作符和Date构造函数即可。

多个措施

  • Date.parse():接收二个表示日期的字符串参数,然后尝试根据这几个字符串重临相应的日子的皮秒数。那么些办法的行为因达成而异,而且一般是因地区而异。
    诸如:要为200四年八月2十三日创造三个日期对象:

新葡萄娱乐在线网站 4

假定传入Date.parse()方法的字符不可能代表日期,那么它会回去NaN。实际上,假使直白将意味日期的字符串传递给Date构造函数,也会在后台调用Date.parse()。

新葡萄娱乐在线网站 5

结果一律

  • Date.UTC():同样重返表日期的阿秒数,但它与Date.parse()在创设时行使差异的音信。
    参数:年份(必须)、基于0的月份(二月是0,四月是一,…)(必须)、月底的哪1天(一到3一)、时辰数(0到二三)、分钟、秒及纳秒数。

新葡萄娱乐在线网站 6

日子和岁月都基于本地时区。

  • Date.now():ECMAScript伍添加了Date.now()方法,重回表示调用那些点羊时的日期和时间的阿秒数。
![](https://upload-images.jianshu.io/upload_images/1281633-1362a3696236cb42.png)

new Date()解析所扶助的参数格式标准

 

var now = new Date();

一而再的点子

toLoaleString():会遵照与浏览器设置的地点相适应的格式重返日期的小运。
toString():重回待有时区音讯的日子和岁月
valueOf():再次来到日期的皮秒表示。因而得以便宜地行使相比操作符来相比较日期值。

var date1 = new Date(2007,0,1);  //January 1,2007
var date2 = new Date(2007,1,1);   //"February 1,2007"

alert(date1 < date2);   //true
alert(date1 > date2);   //false

时光戳格式

以此是最简便易行的也是最不简单出错的。当然唯1的后天不足大致正是对开发者不直观,不可能壹眼看出具体日子。
要求注意的以下两点:

  1. js内的时光戳指的是日前光阴到1970年1月1日00:00:00 UTC对应的毫秒数,和unix时间戳不是八个定义,后者表示秒数,差了一千倍
  2. class=”crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco”
    style=”font-size: 13px !important; line-height: 15px !important;font-size: 13px !important;”> class=”crayon-pre crayon-code”
    style=”font-size: 13px !important; line-height: 15px !important;font-size: 13px !important; -moz-tab-size:四; -o-tab-size:四; -webkit-tab-size:肆; tab-size:肆;”> class=”crayon-r”>new class=”crayon-r”>Date( class=”crayon-v”>timestamp class=”crayon-sy”>) 中的时间戳必须是number格式,
    class=”crayon-syntax crayon-syntax-inline crayon-theme-github crayon-theme-github-inline crayon-font-monaco”
    style=”font-size: 13px !important; line-height: 15px !important;font-size: 13px !important;”> class=”crayon-pre crayon-code”
    style=”font-size: 13px !important; line-height: 15px !important;font-size: 13px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;”> class=”crayon-t”>string 会返回Invalid Date。所以比如new Date('11111111')那种写法是错的

在调用Date构造函数不传递参数情形下,新创设对象活动获得当今天期和时间。若是想依照特定的日子和岁月成立日期对象,必须传入表示该日期的微秒数(即从UTC时间1967.一.1上午起至该日期经过的阿秒数)。为了简化这一进度,ECMAScript提供四个办法:Date.parse()和Date.UTC()

日期格式化方法

新葡萄娱乐在线网站 7

格式化日期方法

时间数字字符串格式

不大清楚那种该怎么描述,便是周围YYYY/MM/DD HH:mm:SS这种。下文以dateString代指。
new Date(dateString)所协理的字符串格式须要知足RFC2822标准或者ISO
8601标准
那二种标准对应的格式分别如下:

  1. 昂科拉FC282二 标准日期字符串
JavaScript

YYYY/MM/DD HH:MM:SS ± timezon(时区用4位数字表示) // eg 1992/02/12
12:23:22+0800

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f6c187675a314957670-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6c187675a314957670-2">
2
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f6c187675a314957670-1" class="crayon-line">
YYYY/MM/DD HH:MM:SS ± timezon(时区用4位数字表示)
</div>
<div id="crayon-5b8f6c187675a314957670-2" class="crayon-line crayon-striped-line">
// eg 1992/02/12 12:23:22+0800
</div>
</div></td>
</tr>
</tbody>
</table>

>  RFC2822还有别的格式,不过上面这个是比较常用的(另外这标准太难啃了,实在没耐心啃完,所以也就没太深入)。RFC2822标准本身还有其他的非数字日期表达方式,不过不在这个话题讨论范围内了,略过
  1. ISO 860一规范日期字符串
JavaScript

YYYY-MM-DDThh:mm:ss ± timezone(时区用HH:MM表示) 1997-07-16T08:20:30Z
//
“Z”表示UTC标准时区,即"00:00",所以这里表示零时区的\`1997年7月16日08时20分30秒\`
//转换成位于东八区的北京时间则为\`1997年7月17日16时20分30秒\`
1997-07-16T19:20:30+01:00 //
表示东一区的1997年7月16日19时20秒30分,转换成UTC标准时间的话是1997-07-16T18:20:30Z

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f6c187675d765819674-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6c187675d765819674-2">
2
</div>
<div class="crayon-num" data-line="crayon-5b8f6c187675d765819674-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6c187675d765819674-4">
4
</div>
<div class="crayon-num" data-line="crayon-5b8f6c187675d765819674-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6c187675d765819674-6">
6
</div>
<div class="crayon-num" data-line="crayon-5b8f6c187675d765819674-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6c187675d765819674-8">
8
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f6c187675d765819674-1" class="crayon-line">
 YYYY-MM-DDThh:mm:ss ± timezone(时区用HH:MM表示)
</div>
<div id="crayon-5b8f6c187675d765819674-2" class="crayon-line crayon-striped-line">
 
</div>
<div id="crayon-5b8f6c187675d765819674-3" class="crayon-line">
 1997-07-16T08:20:30Z
</div>
<div id="crayon-5b8f6c187675d765819674-4" class="crayon-line crayon-striped-line">
 // “Z”表示UTC标准时区,即&quot;00:00&quot;,所以这里表示零时区的`1997年7月16日08时20分30秒`
</div>
<div id="crayon-5b8f6c187675d765819674-5" class="crayon-line">
 //转换成位于东八区的北京时间则为`1997年7月17日16时20分30秒`
</div>
<div id="crayon-5b8f6c187675d765819674-6" class="crayon-line crayon-striped-line">
 
</div>
<div id="crayon-5b8f6c187675d765819674-7" class="crayon-line">
 1997-07-16T19:20:30+01:00
</div>
<div id="crayon-5b8f6c187675d765819674-8" class="crayon-line crayon-striped-line">
 // 表示东一区的1997年7月16日19时20秒30分,转换成UTC标准时间的话是1997-07-16T18:20:30Z
</div>
</div></td>
</tr>
</tbody>
</table>
  1. 日子和岁月首间的T不得以被不难,1省略就出错。
  2. 固然在chrome浏览器上时区也得以用+0100那种奥迪Q5FC282二的款式来表示,但是IE上不帮衬那种混搭写法,所以用ISO860一标准格局表示的时候时区要用+HH:MM

唯有从格式上的话,两者的区分主要在于分隔符的两样。不过须求留意的是,ISO
860一正式的兼容性比福特ExplorerFC282二差得多(比如IE八和iOS均不扶助前者。我知道IE8很多人会无视,不过iOS也有这个坑的话,各位或多或少会谨慎点了吧?),所以1般景况下建议用RFC 2822格式的。
只是供给留意的是,在未钦命时区的前提下,对于只精确到day的日期字符串,RFC 2822归来结果是以当前时区的零点为准,而ISO8601回去结果则会以UTC时间的零点为正规举行分析。
例如:

JavaScript

//XC60FC2822: new Date(‘1994/02/壹叁’) //Thu Feb 一三 1995 00:00:00 放线菌壮观素T+0800
(中国家标准准时间) //ISO8601: new Date(‘1995-0二-一三’) //Thu Feb 13 一九玖三0八:00:00 放线菌壮观素T+0800 (中中原人民共和国家标准准时间)

1
2
3
4
//RFC2822:
new Date(‘1992/02/13’) //Thu Feb 13 1992 00:00:00 GMT+0800 (中国标准时间)
//ISO8601:
new Date(‘1992-02-13’) //Thu Feb 13 1992 08:00:00 GMT+0800 (中国标准时间)

 

而是上边那些只是ES5的标准而已,在ES陆里那三种样式都会变成当前时区的零点为基准1
*不管你们崩溃没,反正我是已经想死了*
至于跨浏览器的dataString解析景况,还能参见那些页面:
JavaScript and Dates, What a
Mess!

据此对于时间字符串对象,个人意见是要么用RFC2822格局,要么本身写个解析函数然后无论是你传啥格式进来。


Date.parse()
措施接收一个意味着日期的字符串参数,然后尝试根据那个字符串再次来到相应日期的飞秒数。ECMA-26二平昔不概念Date.parse()应该补助哪个种类日期格式,由此那几个格局的作为因完成而异,而且壹般是因所在而异。将地点安装为美利坚合资国的浏览器平时都接受下列格式:

RegExp类型


相关文章