1.概念
Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串。
Date();
// "Wed Aug 16 2017 19:37:37 GMT+0800 (CST)"
注意,即使带有参数,Date作为普通函数使用时,返回的还是当前时间。
Date(2000, 1, 1);
// "Wed Aug 16 2017 19:37:37 GMT+0800 (CST)"
2. New Date()
Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例。如果不加参数,生成的就是代表当前时间的对象.
作为构造函数时,Date对象可以接受多种格式的参数。
(1)new Date(milliseconds)
Date对象接受从1970年1月1日00:00:00 UTC开始计算的毫秒数作为参数。这意味着如果将Unix时间戳(单位为秒)作为参数,必须将Unix时间戳乘以1000。
Date构造函数的参数可以是一个负数,表示1970年1月1日之前的时间。
(2)new Date(datestring)
Date对象还接受一个日期字符串作为参数,返回所对应的时间.
日期字符串的完整格式是“month day, year hours:minutes:seconds”,比如“December 25, 1995 13:30:00”。如果省略了小时、分钟或秒数,这些值会被设为0。
但是,其他格式的日期字符串,也可以被解析。事实上,所有可以被Date.parse()方法解析的日期字符串,都可以当作Date对象的参数。
注意,在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)
但是,ES6改变了这种做法,规定凡是没有指定时区的日期字符串,一律认定用户处于本地时区。
(3)new Date(year, month [, day, hours, minutes, seconds, ms])
Date对象还可以接受多个整数作为参数,依次表示年、月、日、小时、分钟、秒和毫秒。如果采用这种格式,最少需要提供两个参数(年和月),其他参数都是可选的,默认等于0。因为如果只使用“年”这一个参数,Date对象会将其解释为毫秒数。
这些参数如果超出了正常范围,会被自动折算。比如,如果月设为15,就折算为下一年的4月。
参数还可以使用负数,表示扣去的时间。
3.Date对象的静态方法
3.1 Date.now()
Date.now方法返回当前距离1970年1月1日 00:00:00 UTC的毫秒数(Unix时间戳乘以1000)。
4.Date实例对象的方法
Date的实例对象,有几十个自己的方法,分为以下三类。
to类:从Date对象返回一个字符串,表示指定的时间。
get类:获取Date对象的日期和时间。
set类:设置Date对象的日期和时间。
4.1 to类方法
(1)Date.prototype.toString()
toString方法返回一个完整的日期字符串。
var d = new Date(2013, 0, 1);
d.toString()
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"
d
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"
因为toString是默认的调用方法,所以如果直接读取Date对象实例,就相当于调用这个方法。
(2)Date.prototype.toUTCString()
toUTCString方法返回对应的UTC时间,也就是比北京时间晚8个小时。
var d = new Date(2013, 0, 1);
d.toUTCString()
// "Mon, 31 Dec 2012 16:00:00 GMT"
d.toString()
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"
(3) Date.prototype.toLocaleDateString()
toLocaleDateString方法返回一个字符串,代表日期的当地写法。
var d = new Date(2017, 7, 17);
d.toLocaleDateString();
// 中文版浏览器为"2017年8月17日"
// 英文版浏览器为"2017/8/17"
4.2 get类方法
Date对象提供了一系列get*方法,用来获取实例对象某个方面的值。
getTime():返回距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法。
getDate():返回实例对象对应每个月的几号(从1开始)。
getDay():返回星期几,星期日为0,星期一为1,以此类推。
getYear():返回距离1900的年数。
getFullYear():返回四位的年份。
getMonth():返回月份(0表示1月,11表示12月)。
getHours():返回小时(0-23)。
getMilliseconds():返回毫秒(0-999)。
getMinutes():返回分钟(0-59)。
getSeconds():返回秒(0-59)。
getTimezoneOffset():返回当前时间与UTC的时区差异,以分钟表示,返回结果考虑到了夏令时因素。
var d = new Date(‘January 6, 2013‘);
d.getDate() // 6
d.getMonth() // 0
d.getYear() // 113
d.getFullYear() // 2013
d.getTimezoneOffset() // -480
上面代码中,最后一行返回-480,表示UTC比当前时间晚480分钟,即8个小时。
下面是一个例子,计算本年度还剩下多少天。
function leftDays() {
var today = new Date();
var endYear = new Date(today.getFullYear(), 11, 31, 23, 59, 59, 999);
var msPerDay = 24 * 60 * 60 * 1000;
return Math.round((endYear.getTime() - today.getTime()) / msPerDay);
}
4.3 Date.prototype.valueOf()
valueOf方法返回实例对象距离1970年1月1日00:00:00 UTC对应的毫秒数,该方法等同于getTime方法。
var d = new Date();
d.valueOf() // 1502942893110
d.getTime() // 1502942893110