Date

2021/12/9

# 设置方法

# new Date

构造函数(四种)

  1. new Date()
  2. new Date(value)
    • 入参:标准日期字符串
  3. new Date(distance)
    • 入参:距离纪元时间的毫秒数
  4. new Date(year[, month, day, hour, minute, seconds, mseconds])
    • 入参:Number[, Number, Number, Number, Number, Number, Number]
 


 


 










 






const date1 = new Date();

const str = date1.toString();
const date2 = new Date(str);

const distance = date1.valueOf();
const date3 = new Date(distance);

const timeArr = [
    date1.getFullYear(),
    date1.getMonth(),
    date1.getDate(),
    date1.getHours(),
    date1.getMinutes(),
    date1.getSeconds(),
    date1.getMilliseconds()
]
const date4 = new Date(...timeArr);

console.log(date1.toString()); // Thu Dec 09 2021 00:16:49 GMT+0800 (中国标准时间)
console.log(date2.toString()); // Thu Dec 09 2021 00:16:49 GMT+0800 (中国标准时间)
console.log(date3.toString()); // Thu Dec 09 2021 00:16:49 GMT+0800 (中国标准时间)
console.log(date4.toString()); // Thu Dec 09 2021 00:16:49 GMT+0800 (中国标准时间)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# setFullYear

  • 作用:设置日期对象本地日期的【年】
  • 调用:date.setFullYear(year[, mounth, day])
  • 入参:Number[, Number, Number]
  • 返回:Number (距纪元时间的毫秒数)

  • 如果时间设置超出了范围,会从后往前更新:日 -> 月 -> 年
  • 设置月时注意月份 - 1

# setMonth

  • 作用:设置日期对象本地日期的【月】
  • 调用:date.setMonth(month[, day])
  • 入参:Number[, Number]
  • 返回:Number (距纪元时间的毫秒数)
  • tip:超出合理范围年会被对应的更改

  • 设置月份记得 - 1
  • 如果【日】设置为0,那么月份会 - 1,日变成上个月最后一天
const date = new Date();

// 当前是12月
console.log(date.getMonth()); // 11

// 设置成【2月0日】,被转换成【1月31日】
date.setMonth(1,0);
console.log(date.getMonth()); // 0
console.log(date);            // 2021-01-31T11:47:37.531Z
1
2
3
4
5
6
7
8
9

# setDate

  • 作用:根据本地日期(不是UTC日期)设置一个日期对象的【日】
  • 调用:date.setDate(day)
  • 入参:Number
  • 返回:Number (距纪元时间的毫秒数)
  • tip:支持负数入参,会月份-1,日期按上个月的最后一天做减法

 


 


 

const date = new Date();
console.log(date); // 2021-12-08T11:23:12.174Z

date.setDate(1);
console.log(date); // 2021-12-01T11:23:12.174Z

date.setDate(-3);
console.log(date); // 2021-11-27T11:23:12.174Z
1
2
3
4
5
6
7
8

# setHours

  • 作用:设置日期对象本地日期的【时】
  • 调用:date.setHours(hour[, minute, second, msecond])
  • 入参:Number[, Number, Number, Number]
  • 返回:Number (距纪元时间的毫秒数)
  • tip:超出合理范围【日】会被对应的更改

  • 如果设置时分秒有超出范围的会自动更新 毫秒 -> 秒 -> 分 -> 时

# setMinutes

  • 作用:设置日期对象本地日期的【分】
  • 调用:date.setMinutes(minutes)
  • 入参:Number
  • 返回:Number (距纪元时间的毫秒数)
  • tip:超出合理范围小时会被对应的更改
const date = new Date();
console.log(date.getMinutes()); // 40

date.setMinutes(10);
console.log(date.getMinutes()); // 10
1
2
3
4
5

# setSeconds

  • 作用:设置日期对象本地日期的【秒】
  • 调用:date.setSeconds(second)
  • 入参:Number
  • 返回:Number (距纪元时间的毫秒数)
  • tip:超出合理范围分钟会被对应的更改
const date = new Date();
date.setSeconds(30);
console.log(date.getSeconds()); // 30
1
2
3

# setMilliseconds

  • 作用:设置日期对象本地日期的【毫秒】
  • 调用:date.setMilliseconds(millisecond)
  • 入参:Number
  • 返回:Number (距纪元时间的毫秒数)
  • tip:超出合理范围秒会被对应的更改
const date = new Date();
console.log(date.getMilliseconds()); // 653

date.setMilliseconds(10);
console.log(date.getMilliseconds()); // 10
1
2
3
4
5

# setTime

  • 作用:用一个纪元时间毫秒数重置本Date对象
  • 调用:date.setTime(distance)
  • 入参:Number (距纪元时间毫秒数)
  • 返回:Number (距纪元时间的毫秒数)





 




 

 

const date1 = new Date();
while (Date.now() < date1.getTime() + 1000) {}

// 停了一秒,date2 和 date1 不相等
const date2 = new Date();
console.log(date2.toString() === date1.toString()); // false

// 用 date1 的时间重置 date2 的时间
const distance = date1.getTime();
console.log(distance); // 1638974495485
date2.setTime(distance);

console.log(date2.toString() === date1.toString()); // true
1
2
3
4
5
6
7
8
9
10
11
12
13

# 获取时间

# getFullYear

  • 作用:拿到【年】
  • 调用:date.getFullYear()
  • 返回:Number (0000-9999)
const date = new Date();
console.log(date.getFullYear()); // 2021
console.log(date.getFullYear() + 1); // 2022
1
2
3

# getMonth

  • 作用:拿到【月】
  • 调用:date.getMonth()
  • 返回:Number (0-11)

  • 月份需要 + 1
const date = new Date();
console.log(date.getMonth()); // 11
1
2

# getDate

  • 作用:拿到date对象的【日】
  • 调用:date.getDate()
  • 返回:Number (1-31)
// 今天12月8号
const date = new Date();
console.log(date.getDate()); // 8
1
2
3

# getDay

  • 作用:拿到【星期几】
  • 调用:date.getDay()
  • 返回:Number (0-6)
  • tip:0是星期天
// 今天星期三
const date = new Date();
console.log(date.getDay()); // 3
1
2
3

# getHours

  • 作用:拿到【时】
  • 调用:date.getHours()
  • 返回:Number (0-23)
const date = new Date();
console.log(date.getHours()); // 18
1
2

# getMinutes

  • 作用:拿到【分】
  • 调用:date.getMinutes()
  • 返回:Number (0-59)
const date = new Date();
console.log(date.getMinutes()); // 20
1
2

# getSeconds

  • 作用:拿到【秒】
  • 调用:date.getSeconds()
  • 返回:Number (0-59)
const date = new Date();
console.log(date.getSeconds()); // 36
1
2

# getMilliseconds

  • 作用:拿到【毫秒】
  • 调用:date.getMilliseconds()
  • 返回:Number (0-999)
const date = new Date();
console.log(date.getMilliseconds()); // 528
1
2

# 获取UTC时间

UTC时间

  • UTC时间:世界标准时间,比中国时间慢8小时。
    UTC时间 - 中国时间 = -480

# getTimezoneOffset

  • 作用:获取协调世界时(UTC)相对于当前时区的时间差值,单位为分钟。
  • 调用:date.getTimezoneOffset()
  • 返回:Number
const date = new Date();
console.log(date.getTimezoneOffset()); // -480
1
2

# getUTCFullYear

  • 作用:拿到【UTC时间标准的】【年】
  • 调用:date.getUTCFullYear()
  • 返回:Number (0000-9999)
const date = new Date();
console.log(date.getUTCFullYear()); // 2021
1
2

# getUTCMonth

  • 作用:获取【UTC时间标准的】【秒】
  • 调用:date.getUTCMonth()
  • 返回:Number (0-11)

  • 月份需要 + 1
const date = new Date();
console.log(date.getUTCMonth()); // 11
1
2

# getUTCDate

  • 作用:拿到【UTC时间标准的】【日】
  • 调用:date.getUTCDate()
  • 返回:Number (0-31)
const date = new Date();
console.log(date.getUTCDate()); // 8
1
2

# getUTCDay

  • 作用:获取【UTC时间标准的】【星期几】
  • 调用:date.getUTCDay()
  • 返回:Number (0-6)
const date = new Date();
console.log(date.getUTCDay()); // 3
1
2

# getUTCHours

  • 作用:获取【UTC时间标准的】【时】
  • 调用:date.getUTCHours()
  • 返回:Number (0-23)
// 现在是中国时间18点,18 - 8 = 10
const date = new Date();
console.log(date.getUTCHours()); // 10
1
2
3

# getUTCMinutes

  • 作用:获取【UTC时间标准的】【分】
  • 调用:date.getUTCMinutes()
  • 返回:Number
const date = new Date();
console.log(date.getUTCMinutes()); // 57
1
2

# getUTCSeconds

  • 作用:获取【UTC时间标准的】【秒】
  • 调用:date.getUTCSeconds()
  • 返回:Number
const date = new Date();
console.log(date.getUTCSeconds()); // 6
1
2

# getUTCMilliseconds

  • 作用:获取【UTC时间标准的】【毫秒】
  • 调用:date.getUTCMilliseconds()
  • 返回:Number (0-999)
const date = new Date();
console.log(date.getUTCMilliseconds()); // 964
1
2

# 设置UTC时间

# setUTCFullYear

  • 作用:设置对象UTC的【年】
  • 调用:date.setUTCFullYear(year[, month, day])
  • 入参:Number[, Number, Number]
  • 返回:Number (距离纪元时间的毫秒数)

  • 月份要 - 1
const date = new Date();
date.setUTCFullYear(1996, 06, 26);
console.log(date.toUTCString()); // Fri, 26 Jul 1996 14:55:55 GMT
console.log(date.toLocaleDateString()); // 1996/7/26
1
2
3
4

# setUTCMonth

  • 作用:设置对象UTC时间的【月】
  • 调用:date.setUTCMonth(month)
  • 入参:Number
  • 返回:Number (距离纪元时间的毫秒数)
  • tip:月份 - 1
const date = new Date();

// 6月
date.setUTCMonth(7);
console.log(date.getUTCMonth()); // 7
1
2
3
4
5

# setUTCDate

  • 作用:设置对象UTC时间的【日】
  • 调用:date.setUTCDate(day)
  • 入参:Number
  • 返回:Number (距离纪元时间的毫秒数)
const date = new Date();
date.setUTCDate(20);
console.log(date.getDate()); // 20
console.log(date.getUTCDate()); // 20
1
2
3
4

# setUTCHours

  • 作用:设置对象UTC时间的【时】
  • 调用:date.setUTCHours(hour[, minute, second])
  • 入参:Number[, Number, Number]
  • 返回:Number (距离纪元时间的毫秒数)
  • tip:UTC时间比中国时间慢8小时
  • 设置UTC时间是【10:59:00】对应北京时间【18:59:00】
const date = new Date();
date.setUTCHours(10, 59, 00);
console.log(date.toUTCString()); // Wed, 08 Dec 2021 10:59:00 GMT
console.log(date.toTimeString()); // 18:59:00 GMT+0800 (中国标准时间)
1
2
3
4

# setUTCMinutes

  • 作用:设置对象UTC时间的分钟数
  • 调用:date.setUTCMinutes(minute[, seconds, mseconds])
  • 入参:Number[, Number, Number]
  • 返回:Number(距离纪元时间的毫秒数)
const date = new Date();
date.setUTCMinutes(5);
console.log(date.getMinutes());    // 5
console.log(date.getUTCMinutes()); // 5
1
2
3
4
  • 设置【分:秒:毫秒】
const date = new Date();
date.setUTCMinutes(5, 5, 5);
console.log(date.toLocaleTimeString()); // 下午11:05:05
1
2
3

# setUTCSeconds

  • 作用:设置UTC时间的【秒】
  • 调用:date.setUTCSeconds(seconds)
  • 入参:Number
  • 返回:Number (距纪元时间的毫秒数)
const date = new Date();
date.setUTCSeconds(20);
console.log(date.getSeconds()); //20
console.log(date.getUTCSeconds()); //20
1
2
3
4

# setUTCMilliseconds

  • 作用:设置UTC时间的【毫秒】
  • 调用:date.setUTCMilliseconds(msconds)
  • 入参:Number
  • 返回:Number (距纪元时间的毫秒数)
const date = new Date();
date.setUTCMilliseconds(100);
console.log(date.getMilliseconds()); // 100
1
2
3

# 打印方法

# 汇总

打印方法汇总

方法 作用比较
Symbol.toPrimitive 内部调用toString()或valueOf()
valueOf 返回到距离纪元时间的毫秒数(一般内部使用,显式调用用getTime) 1638957011751
getTime 返回到距离纪元时间的毫秒数 1638957011751
toString 美式英语日期格式的字符串 Wed Dec 08 2021 17:59:08 GMT+0800 (中国标准时间)
toDateString 美式英语日期格式的年月日 Wed Dec 08 2021
toTimeString 美式英语日期格式的时分秒 23:51:33 GMT+0800 (中国标准时间)
toISOString 将对象的UTC时区时间返回一个ISO标准的字符串 2021-12-08T15:24:29.682Z
toJSON 将对象的UTC时区时间返回一个ISO标准的字符串 2021-12-08T15:24:29.682Z
toLocaleString 返回指定时区的字符串 12/8/2021, 11:38:35 PM
toLocaleDateString 返回指定时区的年月日 2021/12/8
toLocaleTimeString 返回指定时区的时分秒 下午11:46:58

# Symbol.toPrimitive

  • 作用:自动转化值
  • 调用:date[Symbol.toPrimitive] (hint)
  • 入参:'number' | 'string' | 'default'
  • 返回:String | Number
  • tip:内部调用,当期望一个原始值却收到一个对象时,调用此方法。根据hint,调用valueOf或toString,无法转换最后抛出错误。

# valueOf

  • 作用:返回日期对象的原始值
  • 调用:date.valueOf()
  • 返回:Number
  • tip:从1970年1月1日0时0分0秒(UTC,即协调世界时)到该日期的毫秒数。

  • 该方法功能和Date.prototype.getTime()一样
  • valueOf一般内部调用,显式调用一般用.getTime()
const date = new Date();

console.log(date.valueOf()); // 1638957011751
console.log(typeof date.valueOf()); // number

// getTime作用相同
console.log(date.getTime()); // 1638957011751
console.log(typeof date.getTime()); // number
1
2
3
4
5
6
7
8

# toString

  • 作用:将date对象输出为美式英语日期格式的字符串
  • 调用:date.toString()
  • 返回:String
const date = new Date();
console.log(date.toString()); // Wed Dec 08 2021 17:59:08 GMT+0800 (中国标准时间)
1
2

# getTime

  • 作用:获取从1970年1月1日0时0分0秒(UTC,即协调世界时)到该日期的毫秒数
  • 调用:date.getTime()
  • 返回:Number
  • tip:valueOf()作用和getTime()一样,但一般显式调用用getTime()
const date = new Date();
console.log(date.getTime()); // 1638959162725
1
2

# toDateString

  • 作用:美式英语和人类易读的形式返回一个日期对象日期部分的字符串
  • 调用:date.toDateString()
  • 返回:String
const date = new Date();
console.log(date.toDateString());   // Wed Dec 08 2021
console.log(date.toString());       // Wed Dec 08 2021 23:18:56 GMT+0800 (中国标准时间)
console.log(date.toLocaleString()); // 2021/12/8 下午11:18:56
console.log(date.toUTCString());    // Wed, 08 Dec 2021 15:20:31 GMT
console.log(date.valueOf());        // 1638976736688
1
2
3
4
5
6

# toTimeString

  • 作用:拿到时间对象的【时分秒】
  • 调用:date.toTimeString()
  • 返回:String
const date = new Date();
console.log(date.toTimeString()); // 23:51:33 GMT+0800 (中国标准时间)
1
2

# toISOString

  • 作用:将对象的UTC时间返回一个ISO标准的字符串【YYYY-MM-DDTHH:mm:ss.sssZ】
  • 调用:date.toISOString()
  • 返回:String
  • tip:总是UTC时区时间,最后会加一个Z做标识
const date = new Date();
console.log(date.toISOString()); // 2021-12-08T15:24:29.682Z
1
2

# toJSON

  • 作用:返回date对象的字符串格式。
  • 调用:date.toJSON()
  • 返回:String
const date = new Date();
console.log(date.toJSON());      // 2021-12-08T15:28:47.720Z
console.log(date.toISOString()); // 2021-12-08T15:28:47.720Z

const json = date.toJSON();
const date2 = new Date(json);
console.log(date2.toString() === date.toString()); // true
1
2
3
4
5
6
7

# toLocaleString

  • 作用:将日期对象以指定的时区返回字符串(默认当地时区)
  • 调用:date.toLocaleString(locale, options)
  • 入参:String, Object
  • 返回:String
const date = new Date();
console.log(date.toString());              // Wed Dec 08 2021 23:38:35 GMT+0800 (中国标准时间)
console.log(date.toLocaleString());        // 2021/12/8 下午11:38:35
console.log(date.toLocaleString('en-US')); // 12/8/2021, 11:38:35 PM
1
2
3
4

# toLocaleDateString

  • 作用:将日期对象以指定的时区返回字符串(默认当地时区)(只要年月日)
  • 调用:date.toLocaleDateString(locale, options)
  • 入参:String, Object
  • 返回:String
const date = new Date();
console.log(date.toLocaleDateString());        // 2021/12/8
console.log(date.toLocaleDateString('en-US')); // 12/8/2021
1
2
3

# toLocaleTimeString

  • 作用:将日期对象以指定的时区返回字符串(默认当地时区)(只要时分秒)
  • 调用:date.toLocaleTimeString(locale, options)
  • 入参:String, Object
  • 返回:String
const date = new Date();
console.log(date.toLocaleTimeString());        // 下午11:46:58
console.log(date.toLocaleTimeString('en-US')); // 11:46:58 PM
1
2
3

# 静态方法

# now

  • 作用:获取自 1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数。
  • 调用:Date.now()
  • 返回:Number

# parse

  • 作用:解析日期字符串,返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数
  • 调用:Date.parse(String);
  • 返回:Number

  • 如果不确定字符串格式是否被支持,最好手动解析
const date = new Date();
const str = date.toString();
console.log(str);             // Wed Dec 08 2021 19:15:52 GMT+0800 (中国标准时间)
console.log(Date.parse(str)); // 1638962152000
1
2
3
4

# UTC

  • 作用:以UTC的形式构造纪元时间的距离毫秒数
  • 调用:Date.UTC(year[, month, day, hour, minutes, seconds, mseconds])
  • 入参:Number[, Number, Number, Number, Number, Number]
  • 返回:Number
const time1 = [1996, 06, 26, 10, 00, 00];
const date1 = new Date(...time1);

// UTC时间比中国时间慢8小时
const time2 = time1.map((item, index) => index !== 3 ? item : item - 8);

const date2 = new Date(Date.UTC(...time2));
console.log(date1.toString() == date2.toString()); // true
1
2
3
4
5
6
7
8

# 其他问题

# 手写格式化时间

# 判断无效时间

上次更新: 9/17/2024