JS对象类型-Date日期对象
Date类型使用自UTC1970年1月1日0点开始经过的毫秒数来保存日期,它可以表示的时间范围是1970年1月1日0点前后的各1亿天。
基础知识
标准时间
标准时间是指GMT(格林尼治标准时间)和UTC(世界协调时间)。GMT是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。UTC全称Coordinated Universal Time,是以原子时长为基础,在时刻上尽量接近于世界时的一种时间计量系统。
由于GMT与实际的太阳时有16分钟的偏差,所以现在基本都以UTC作为标准时间,这套时间系统被应用于许多互联网和万维网的标准中,中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8
日期时间格式
ECMAScript定义了一个基于ISO8601扩展格式的简化日期时间字符串互换格式。完整格式为YYYY-MM-DDTHH:mm:ss:sssZ
YYYY 公历年份,如果值在0-99之间,会自动加上1900
- 日期间隔符,用破折号表示,在字符串中出现两次
MM 月份,从01(一月)到12(12月)
DD 日期,从01到31
T 时间元素的开始(Time),用大写字母T表示
HH 自午夜0时开始的小时数,用两个十进制数字表示
: 时间间隔符,用冒号表示,在字符串中出现两次
mm 分钟数,用两个十进制数字表示
ss 秒数,用两个十进制数字表示
sss 毫秒数,用三个十进制数字表示
Z 时区偏移量,Z指UTC,“Z”或“+”或“-”与时间表达式“hh:mm”组成
前置0不能省略,否则在完整格式的情况下会报错。
所有数字必须是十进制,如果缺少MM或DD字段,用01作为其值。如果缺少mm或ss字段,用00作为其值。如果缺少sss字段,用000作为其值。如果没有时区偏移,用字母Z作为其值。
月日
在JS中,月是从0开始计算的,所以1-12月用0-11表示;日是从1开始计算的,1就是第一天。
一年12个月中,1、3、5、7、8、10、12每月有31天;4、6、9、11月每月有30天;闰年2月有29天,平年2月有28天。
闰年的定义:可被4整除且不可被100整除或可被400整除的年份
if(month == 2){
if((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0){ //闰年
days = 29;
} else { //平年
days = 28;
}
//如果是第4、6、9、11月
}else if(month == 4 || month == 6 ||month == 9 ||month == 11){
days = 30;
}else{
days = 31;
}
JS中,各月份的简写经常在日期字符串中使用
一月 Jan January
二月 Feb February
三月 Mar March
...
星期
星期是从星期日开始,星期六结束,用0-6来表示。在JS中,各星期的简写经常在日期字符串中使用。
星期日 sunday Sun
星期一 monday Mon
星期二 Tuesday Tue
星期三 Wednesday Wed
星期四 Thursday Thu
星期五 Friday Fri
星期六 Saturday Sar
时分秒
1天 = 24小时 = 24*60分 = 24*60*60秒 = 24*60*60*1000毫秒
静态方法
Date对象有三个静态方法:Date.now()、Date.parse()、Date.UTC()。这些方法通过Date()构造函数本身调用,而不能通过Date实例对象调用。
Date.now()
Date.now()方法返回当前时间距离1970年1月1日0点UTC的毫秒数,不支持传递参数。
Date.now() // 1528086630000
typeof Date.now() // 'number'
该方法常用于计算代码的执行时间
var start = Date.now();
doSomething();
var stop = Date.now();
console.log(stop - start);
Date.parse()
Date.parse(date)用于解析日期字符串,返回给定日期距离1970年1月1日0点的毫秒时间差。
参数除了是标准日期格式外,也可以是下面的格式:
- '月/日/年'
- '月 日,年'
- '星期 月 日 年 时:分:秒 时区'
Date.parse('6/4/2018') // 1528041600000
Date.parse('6 4,2018') // 1528041600000
Date.parse('Mon Jun 04 2018 12:30:30 GMT+0800') // 1528086630000
Date.parse('2018-06-04T12:30:30') // 1528086630000
Date.parse() // NaN
注意: 日期时间字符串格式中,如果日期有前置0,则会解析为UTC时间,否则解析成本地时间。
// Mon Jun 04 2018 08:00:00 GMT+0800
Date.parse('2018-06-04') // 1528070400000
// Mon Jun 04 2018 00:00:00 GMT+0800
Date.parse('2018-6-4') // 1528041600000
Date.UTC()
Date.UTC(year,month,day,hours,minutes,seconds,ms)也返回给定日期距离1970年1月1日0点的毫秒时间差。它有七个参数,year和month参数是固定的,其余参数可选。该方法使用的是UTC时间,而不是本地时间。
Date.UTC(2018,6,4,12,30,30,000) // 1530707430000
Date.UTC(1970,1,1,0) // 2678400000
构造函数
Date()函数不用new操作符调用时,和普通函数一样。它会忽略传入参数,并返回当前日期时间的一个字符串。
console.log(Date()) // Mon Jun 04 2018 12:30:30 GMT+0800 (中国标准时间)
console.log(typeof Date()) // string
Date()函数使用new操作符作为构造函数调用时,如果不传参数,同样会返回当前日期时间的一个字符串。和直接调用Date函数不同的是它会创建一个Date对象。
console.log(new Date()) // Mon Jun 04 2018 12:30:30 GMT+0800 (中国标准时间)
console.log(typeof new Date()) // object
Date()函数可接受一个数字参数,参数表示距离1970年1月1日0点的毫秒数。
console.log(new Date(0)) // Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
Date()函数可以接受字符串参数,参数形式类似于Date.parse()方法。
console.log(new Date('6/4/2018')) // Mon Jun 04 2018 00:00:00 GMT+0800 (中国标准时间)
console.log(new Date('6 4,2018')) // Mon Jun 04 2018 00:00:00 GMT+0800 (中国标准时间)
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800')) // Mon Jun 04 2018 12:30:30 GMT+0800 (中国标准时间)
console.log(new Date('2018-06-04T12:30:30')) // Mon Jun 04 2018 12:30:30 GMT+0800 (中国标准时间)
Date()函数可以接受类似于Date.UTC()方法的参数。Date.UTC()方法返回的是UTC时间且是毫秒数,Date()函数返回的是本地时间。
new Date(2018,6,4,12,30,30,000) // Mon Jun 04 2018 12:30:30 GMT+0800 (中国标准时间)
new Date(1970,1,1,0) // Sun Feb 01 1970 00:00:00 GMT+0800 (中国标准时间)
实例方法
Date对象没有直接可读写的属性,日期和时间的读取都需要通过方法。多数方法都有UTC时间和本地时间两种表示形式,下面使用类似get[UTC]Day()这种方式表示getDay()和getUTCDay()
Date对象方法比较多,可以分为3大类:to类、get类、set类
to类
to类方法返回一个字符串,表示指定的时间
【toString()】返回本地时区日期时间字符串
【toUTCString()】返回UTC日期时间字符串
【toISOString()】 返回标准日期时间格式的字符串
【toDateString()】 返回日期部分的字符串
【toTimeString()】 返回时间部分的字符串
【toJSON()】 返回JSON格式的日期时间字符串,与toISOString()返回结果相同
console.log(new Date('2018-6-4').toString()) // Mon Jun 04 2018 00:00:00 GMT+0800 (中国标准时间)
console.log(new Date('2018-6-4').toUTCString()) // Sun, 03 Jun 2018 16:00:00 GMT
console.log(new Date('2018-6-4').toUTCString()) // 2018-06-03T16:00:00.000Z
console.log(new Date('2018-6-4').toDateString()) // Mon Jun 04 2018
console.log(new Date('2018-6-4').toTimeString()) // 00:00:00 GMT+0800 (中国标准时间)
console.log(new Date('2018-6-4').toJSON()) // 2018-06-03T16:00:00.000Z
【toLocaleString()】 toString()方法的本地化转换
【toLocaleTimeString()】 toTimeString()方法的本地化转换
【toLocaleDateString()】 toDateString()方法的本地化转换
console.log(new Date('2018-6-4').toLocaleString()) // 2018/6/4 上午12:00:00
console.log(new Date('2018-6-4').toLocaleTimeString()) // 上午12:00:00
console.log(new Date('2018-6-4').toLocaleDateString()) // 2018/6/4
get类
get类方法用于获取实例对象某个方面的值。
【valueOf()】返回距离1970年1月1日0点的毫秒数
console.log(new Date(2018,6,4).valueOf()) // 1530633600000
console.log(new Date(2018,6,4) < new Date(2018,6,5)) // true
【getTime()】返回距离1970年1月1日0点的毫秒数,结果valueOf()一样
【getTimezoneOffset()】 返回当前时间与UTC的时区差异,以分钟表示,返回结果考虑到了夏令时因素
console.log(new Date(2018,6,4).getTime()) // 1530633600000
console.log(new Date(2018,6,4).getTimezoneOffset()) // -480
【get[UTC]FullYear()】返回年份
【get[UTC]Month()】返回月份(0-11)
【get[UTC]Date()】返回第几天(1-31)
【get[UTC]Day()】返回星期几(0-6)
【get[UTC]Hours()】返回小时值(0-23)
【get[UTC]Minutes()】返回分钟值(0-59)
【get[UTC]Seconds()】返回秒值(0-59)
【get[UTC]Milliseconds()】返回毫秒值(0-999)
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getFullYear()) // 2018
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getMonth()) // 5
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getDate()) // 4
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getDay()) // 1
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getHours()) // 12
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getMinutes()) // 30
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getSeconds()) // 30
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getMilliseconds()) // 0
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCFullYear()) // 2018
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCMonth()) // 5
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCDate()) // 4
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCDay()) // 1
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCHours()) // 4
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCMinutes()) // 30
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCSeconds()) // 30
console.log(new Date('Mon Jun 04 2018 12:30:30 GMT+0800').getUTCMilliseconds()) // 0
只有getUTCHours()值不一样,其他都一样。
set类
set类方法用于设置实例对象的各个方面,set类方法和get基本对应。星期只能获取,不能设置。最终返回调整后的日期毫秒数。
【setTime()】使用毫秒格式设置Date对象的值
var d = new Date('2018-01-01')
d.setTime(1528086630000)
console.log(d.setTime(1528086630000),d) // 1528086630000 Mon Jun 04 2018 12:30:30 GMT+0800 (中国标准时间)
【set[UTC]FullYear()】设置年份,以及可选的月份值和日期值。
【set[UTC]Month()】设置月份,以及可选的日期值。
【set[UTC]Date()】设置第几天。
【set[UTC]Hours()】设置小时值,以及可选的分钟值、秒值及毫秒值。
【set[UTC]Minutes()】设置分钟值,以及可选秒值及毫秒值。
【set[UTC]Seconds()】设置秒值,以及可选的毫秒值。
【set[UTC]Milliseconds()】设置毫秒值。
var d = new Date('2018-01-01')
console.log(d.setFullYear(2018,6,4), d.getFullYear()) // 1530662400000 2018
console.log(d.setMonth(6,4), d.getMonth()) // 1530662400000 6
console.log(d.setDate(4), d.getDate()) // 1530662400000 4
console.log(d.setHours(12,30,30,000), d.getHours()) // 1530678630000 12
console.log(d.setMinutes(30), d.getMinutes()) // 1530678630000 30
console.log(d.setSeconds(30), d.getSeconds()) // 1530678630000 30
console.log(d.setMilliseconds(000), d.getMilliseconds()) // 1530678630000 0