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

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