JS Date對象及日期處理的坑

1. Bug

不要這樣寫new Date('2019-3-5'),會出bug。這個String格式爲YYYY-M-D。

在iOS手機和safari瀏覽器上,這個格式會報錯,改爲YYYY-MM-DD,即new Date('2019-03-05')是可以的,用/也是可以的,即new Date('2019/3/5')

下圖爲Safari的結果:

在這裏插入圖片描述

但是,有一些資料提到用’-'連接的日期字符串在IE上轉換會失敗,試過之後發現並不會,不確定是不是因爲IE版本問題。

建議

(1) 日期字符串用/的格式

不管是YYYY/MM/DD還是YYYY/M/D,都可。

var str = '2019-3-5';
str = str.split('-').join('/'); //或: str.replace(new RegExp(/-/g),'/')
var date = new Date(str);

(2) 使用moment.js日期處理類庫

官網:http://momentjs.cn/

2. Date對象

(1) 構造函數

注意:構造函數返回的都是Date對象。

[1] new Date()

返回本地日期和時間的Date對象

new Date() //=> Thu Mar 07 2019 11:31:45 GMT+0800 (China Standard Time)

[2] new Date(毫秒時間戳)

參數:毫秒時間戳(表示從1970/01/01 00:00:00爲起點的毫秒數)。注意,要加上本地所在時區,因爲北京是東八區,所以起始時間是1970/01/01 08:00:00

返回:Date對象

new Date(0) //=> Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)

[3] new Date(日期字符串)

由上文,推薦日期字符串的格式爲:YYYY/MM/DD hh:mm:ss
返回Date對象

new Date('2019/03/07 07:05:01') //=> Thu Mar 07 2019 07:05:01 GMT+0800 (China Standard Time)

(2) 實例方法

Date對象的實例方法主要分爲2種形式:本地時間和UTC時間。例如:

var date = new Date(); //=> Thu Mar 07 2019 14:08:04 GMT+0800 (China Standard Time)

date.getHours();       //=> 14
date.getUTCHours();    //=> 6

下面列舉幾個容易混淆的:

  • getDate():返回Date對象的月份中的日期值,範圍是1~31
  • getDay():返回Date對象的一週中的星期值,0爲星期天,1爲星期一,依次類推
  • getTime():返回Date對象與’1970/01/01 00:00:00’之間的毫秒值(北京時間的時區爲東8區,起點時間實際爲:‘1970/01/01 08:00:00’)
  • valueOf():返回 Date 對象的原始值(毫秒值),和getTime()一樣
var date = new Date(); //=> Thu Mar 07 2019 14:25:11 GMT+0800 (China Standard Time)
date.getDate();        //=> 7
date.getDay();         //=> 4
date.getTime();        //=> 1551939911331
date.valueOf();        //=> 1551939911331

(3) 靜態方法

[1] Date.now()

返回當前日期和時間的Date對象與’1970/01/01 00:00:00’之間的毫秒值(北京時間的時區爲東8區,起點時間實際爲:‘1970/01/01 08:00:00’)

這個和new Date()有什麼區別?

Date.now()返回的是毫秒值new Date()返回的是Date對象

Date.now(); 

//等價於

var date = new Date();
date.getTime();

[2] Date.parse(日期字符串)

字符串轉換爲Date對象 ,然後返回此Date對象與’1970/01/01 00:00:00’之間的毫秒值(北京時間的時區爲東8區,起點時間實際爲:‘1970/01/01 08:00:00’)

Date.parse('2019/03/07'); //=> 1551888000000

//等價於

var date = new Date('2019/03/07');
date.getTime();           //=> 1551888000000

3. Date對象、日期字符串、時間戳之間的轉換

上面提到的實例方法,是需要Date對象的實例纔可以調用。那不免在Date對象、日期字符串和毫秒上需要進行轉換。

(1) Date對象 <=> 日期字符串

Date對象 => 日期字符串

var date = new Date();
date.toDateString();       //=> "Thu Mar 07 2019"
date.toUTCString();        //=> "Thu, 07 Mar 2019 07:55:36 GMT"
date.toLocaleString();     //=> "3/7/2019, 3:55:36 PM"
date.toLocaleDateString(); //=> "3/7/2019"

日期字符串 => Date對象

var date = new Date('2019/03/07'); //=> Thu Mar 07 2019 00:00:00 GMT+0800 (China Standard Time)

(2) Date對象 <=> 時間戳

Date對象 => 時間戳

var date = new Date();
date.getTime(); //=> 1551946333499
date.valueOf(); //=> 1551946333499

時間戳 => Date對象

var date = new Date(1551946333499); //=> Thu Mar 07 2019 16:12:13 GMT+0800 (China Standard Time)

(3) 日期字符串 <=> 時間戳

日期字符串 => 時間戳

Date.parse('2019/03/07') //=> 1551888000000

時間戳 => 日期字符串

var date = new Date(1551888000000);
date.toLocaleDateString(); //=> "3/7/2019"

————

其他日期處理函數請參考:https://blog.csdn.net/joyce_lcy/article/details/85697437

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章