1

js时间Date对象介绍

 2 years ago
source link: https://www.fly63.com/article/detial/11141
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

在做时间转换的时候,发现用“2016-04-12”转出来的时间戳是 2016-04-12 08:00的时间点,而不是0点。

new Date('2016-04-12').getTime();
// 1460419200000
 
new Date(1460419200000);
// Tue Apr 12 2016 08:00:00 GMT+0800

最后发现,如果将日期格式换成“2016/04/12”,则正常换算成0点。

new Date(new Date('2016/04/12').getTime());
// Tue Apr 12 2016 00:00:00 GMT+0800

概述

Date对象是JavaScript提供的日期和时间的操作接口。它有多种用法。

JavaScript内部,所有日期和时间都储存为一个整数,表示当前时间距离1970年1月1日00:00:00的毫秒数,正负的范围为基准时间前后各1亿天。

Date()

作为一个函数,Date对象可以直接调用,返回一个当前日期和时间的字符串。

Date()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
 
Date(2000, 1, 1)
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"

上面代码说明,无论有没有参数,直接调用Date总是返回当前时间。

new Date()

Date对象还是一个构造函数,对它使用new命令,会返回一个Date对象的实例。如果不加参数,生成的就是代表当前时间的对象。

var today = new Date();
 
today
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
 
// 等同于
today.toString()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
作为构造函数时,Date对象可以接受多种格式的参数。

(1)new Date(milliseconds)

Date对象接受从1970年1月1日00:00:00 UTC开始计算的毫秒数作为参数。这意味着如果将Unix时间戳作为参数,必须将Unix时间戳乘以1000。

new Date(1378218728000)
// Tue Sep 03 2013 22:32:08 GMT+0800 (CST)
 
// 1970年1月2日的零时
var Jan02_1970 = new Date(3600 * 24 * 1000);
// Fri Jan 02 1970 08:00:00 GMT+0800 (CST)
 
// 1969年12月31日的零时
var Dec31_1969 = new Date(-3600 * 24 * 1000);
// Wed Dec 31 1969 08:00:00 GMT+0800 (CST)

上面代码说明,Date构造函数的参数可以是一个负数,表示1970年1月1日之前的时间。Date对象能够表示的日期范围是1970年1月1日前后各一亿天。

(2)new Date(datestring)

Date对象还接受一个日期字符串作为参数,返回所对应的时间。 

new Date("January 6, 2013");
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)

日期字符串的完整格式是“Month day, year hours:minutes:seconds”,比如“December 25, 1995 13:30:00”。如果省略了小时、分钟或秒数,这些值会被设为0。

但是,其他格式的日期字符串,也可以被解析。事实上,所有可以被Date.parse()方法解析的日期字符串,都可以当作Date对象的参数

new Date("2013-2-15")
new Date('2013/2/15')
new Date("2013-FEB-15")
new Date("FEB, 15, 2013")
new Date("FEB 15, 2013")
new Date("Feberuary, 15, 2013")
new Date("Feberuary 15, 2013")
new Date("15, Feberuary, 2013")
 
// Fri Feb 15 2013 00:00:00 GMT+0800 (CST)

上面多种日期字符串的写法,返回的都是同一个时间。

注意,在ES5之中,如果日期采用连词线(-)格式分隔,且具有前导0,JavaScript会认为这是一个ISO格式的日期字符串,导致返回的时间是以UTC时区计算的。  

new Date('2014-01-01')
// Wed Jan 01 2014 08:00:00 GMT+0800 (CST)
 
new Date('2014-1-1')
// Wed Jan 01 2014 00:00:00 GMT+0800 (CST)

上面代码中,日期字符串有没有前导0,返回的结果是不一样的。如果没有前导0,JavaScript引擎假设用户处于本地时区,所以本例返回0点0分。如果有前导0(即如果你以ISO格式表示日期),就假设用户处于格林尼治国际标准时的时区,所以返回8点0分。但是,ES6改变了这种做法,规定凡是没有指定时区的日期字符串,一律认定用户处于本地时区。

对于其他格式的日期字符串,一律视为非ISO格式,采用本地时区作为计时标准。

new Date('2014-12-11')
// Thu Dec 11 2014 08:00:00 GMT+0800 (CST)
 
new Date('2014/12/11')
// Thu Dec 11 2014 00:00:00 GMT+0800 (CST)

上面代码中,第一个日期字符串是ISO格式,第二个不是。

(3)new Date(year, month [, day, hours, minutes, seconds, ms])

Date对象还可以接受多个整数作为参数,依次表示年、月、日、小时、分钟、秒和毫秒。如果采用这种格式,最少需要提供两个参数(年和月),其他参数都是可选的,默认等于0。因为如果只使用“年”这一个参数,Date对象会将其解释为毫秒数。

new Date(2013)
// Thu Jan 01 1970 08:00:02 GMT+0800 (CST)

上面代码中,2013被解释为毫秒数,而不是年份。

其他情况下,被省略的参数默认都是0。

new Date(2013, 0)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, 1)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, 1, 0)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, 1, 0, 0, 0, 0)
// Tue Jan 01 2013 00:00:00 GMT+0800 (CST)

上面代码(除了第一行)返回的是2013年1月1日零点的时间,可以看到月份从0开始计算,因此1月是0,12月是11。但是,月份里面的天数从1开始计算。

这些参数如果超出了正常范围,会被自动折算。比如,如果月设为15,就折算为下一年的4月。 

new Date(2013, 15)
// Tue Apr 01 2014 00:00:00 GMT+0800 (CST)
 
new Date(2013,0,0)
// Mon Dec 31 2012 00:00:00 GMT+0800 (CST)

参数还可以使用负数,表示扣去的时间。

new Date(2013, -1)
// Sat Dec 01 2012 00:00:00 GMT+0800 (CST)
 
new Date(2013, 0, -1)
// Sun Dec 30 2012 00:00:00 GMT+0800 (CST)

上面代码分别对月和日使用了负数,表示从基准日扣去相应的时间。

年的情况有所不同,如果为0,表示1900年;如果为1,就表示1901年;如果为负数,则表示公元前。

new Date(0, 0)
// Mon Jan 01 1900 00:00:00 GMT+0800 (CST)
 
new Date(1, 0)
// Tue Jan 01 1901 00:00:00 GMT+0800 (CST)
 
new Date(-1, 0)
// Fri Jan 01 -1 00:00:00 GMT+0800 (CST)

日期的运算

类型转换时,Date对象的实例如果转为数值,则等于对应的毫秒数;如果转为字符串,则等于对应的日期字符串。所以,两个日期对象进行减法运算,返回的就是它们间隔的毫秒数;进行加法运算,返回的就是连接后的两个字符串。

var d1 = new Date(2000, 2, 1);
var d2 = new Date(2000, 3, 1);
 
d2 - d1
// 2678400000
 
d2 + d1
// "Sat Apr 01 2000 00:00:00 GMT+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"

链接: https://www.fly63.com/article/detial/11141


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK