>[success] # Date 1. `GMT`是英国伦敦的**皇家格林威治( Greenwich )天文台**的标准时间(刚好在本初子午线经过的地方) 1.1. 往**东**的时区时间晚(表示为 **GMT+hh:mm**)、往**西**的时区时间早(表示为 **GMT-hh:mm**) 例子说明:**Sat Jul 09 2022 09:38:28 GMT+0800 (中国标准时间)** 中国是东八区 2.`UTC` 公转有一定的误差,也会造成GMT的时间会造成一定的误差,于是就提出了根据原子钟计算的标准时间**UTC**(Coordinated Universal Time) **注**:GMT依然在使用,主要表示的是某个时区中的时间,而UTC是标准的时间 >[info] ## 两种时间格式 1. `Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)` -- 是RFC 2822标准 2. `2022-07-09T02:14:44.989Z` -- ISO 8601标准 2.1. **ISO 8601标准** 个参数说明 **YYYY**:年份,0000 ~ 9999 **MM**:月份,01 ~ 12 **DD**:日,01 ~ 31 **T**:分隔日期和时间,没有特殊含义,可以省略 **HH**:小时,00 ~ 24 **mm**:分钟,00 ~ 59 **ss**:秒,00 ~ 59 .**sss**:毫秒 **Z**:时区 * ISO8601,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》,规定了国际标准日期与时间表示法。 * 只使用数字为基本格式。使用短横线"-"间隔开年、月、日为扩展格式。 * 每个日期和时间值都有一个固定的位数,必须用前导零填充。 * 日期时间表示只能有数字或少数特殊字符组成(如“ - ”,“:”,“T”,“W”和“Z”),不允许出现地方写法,如“1月”或“星期四”等。 * ISO 8601使用24小时制。HH:MM:SS.sss,HH:MM:SS,HH:MM,HH为合规的时间格式。 * 用字母T分隔日期和时间。如  20180703T224426Z   或  2018-07-03T22:44:26Z 。 [由浅入深,走进中级工程师都未必知道的 JavaScript 时间处理冷知识](https://blog.51cto.com/u_15308298/3173445) >[info] ## Date 语法 ~~~ new Date(); // 打印结果为当前地区时间 // 打印结果 Sat Jul 09 2022 09:49:39 GMT+0800 (中国标准时间) new Date('2022-07-09') // 传入时间格式字符串 这种不推荐 字符串格式 2022/07/09 等等 // 打印结果 Sat Jul 09 2022 08:00:00 GMT+0800 (中国标准时间) new Date(2022,07,07) // 注1 new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]); // 打印结果 Sun Aug 07 2022 00:00:00 GMT+0800 (中国标准时间) new Date(1000) // 传入是数字,会被当做毫秒处理表示从1970-01-01 00:00:00 UTC 经过的毫秒数 // 打印结果 Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间) new Date().toISOString() // 打印ISO8601格式 // 打印结果 '2022-07-09T02:14:44.989Z' ~~~ * 注1 当 Date 作为构造函数调用并传入多个参数时,如果数值大于合理范围时(如月份为 13 或者分钟数为 70),相邻的数值会被调整。比如 new Date(2013, 13, 1) 等于 new Date(2014, 1, 1),它们都表示日期 2014-02-01(注意月份是从 0 开始的)。其他数值也是类似,new Date(2013, 2, 1, 0, 70) 等于 new Date(2013, 2, 1, 1, 10),都表示同一个时间:`2013-03-01T01:10:00` >[danger] ##### 获取时间戳 * **Unix 时间戳**:它是一个整数值,表示自1970年1月1日00:00:00 UTC以来的毫秒数 1. **new Date().getTime()** 2. **new Date().valueOf()** 3. **+new Date()** 4. **Date.now()** 5. **Date.parse(dateString)** 等同于 **new Date(dateString).getTime()** 操作 举个例子,需要符合 RFC2822 或 ISO 8601 日期格式的字符串; 比如YYYY-MM-DDTHH:mm:ss.sssZ,如果输入的格式不能被解析,那么会返回NaN **Date.parse('2022-07-09T02:14:44.989Z')** 打印结果`1657332884989` >[danger] ##### 从Date对象中获取 1. **getFullYear()**:获取年份(4 位数); 2. **getMonth()**:获取月份,从 0 到 11; 3. **getDate()**:获取当月的具体日期,从 1 到 31; 4. **getHours()**:获取小时; 5. **getMinutes()**:获取分钟; 6. **getSeconds()**:获取秒钟; 7. **getMilliseconds()**:获取毫秒; 8. **getDay()** 获取一周中的第几天,从 0(星期日)到 6(星期六) >[danger] ##### 从 Date 中赋值 1. **setFullYear(year, \[month\], \[date\])** 2. **setMonth(month, \[date\])** 3. **setDate(date)** 4. **setHours(hour, \[min\], \[sec\], \[ms\])** 5. **setMinutes(min, \[sec\], \[ms\])** 6. **setSeconds(sec, \[ms\])** 7. **setMilliseconds(ms)** 8. **setTime(milliseconds)** * 注: 设置超范围的数值,它会自动校准