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点的毫秒时间差。

参数除了是标准日期格式外,也可以是下面的格式:

  1. '月/日/年'
  2. '月 日,年'
  3. '星期 月 日 年 时:分:秒 时区'
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
posted @ 2021-09-29 11:01  wmui  阅读(386)  评论(0编辑  收藏  举报