一、概念
1、GTM和UTC
GMT(格林尼治标准时间,Greenwich Mean Time)和 UTC(协调世界时,Coordinated Universal Time)都是以零时区(0°经线,通过英国格林尼治皇家天文台)为基准的时间标准,它们在表示时间上通常被视为等同,即两者都代表 UTC+0 时区。
| 特性 | GMT (格林尼治标准时间) | UTC (协调世界时) |
|---|---|---|
| 基础 | 地球自转(天文观测) | 原子钟(国际原子时 + 闰秒) |
| 精确性 | 受地球自转影响,略有波动 | 极其精确和稳定 |
| 是否闰秒 | 无 | 有(用于与地球自转同步) |
| 现代地位 | 历史性/通俗用法 | 国际标准时间 |
| 时间值 | 与 UTC 在大多数日常场景下相同 | 与 GMT 在大多数日常场景下相同 |
2、时间戳
时间戳表示UTC 时间 距离 1970年1月1日 08:00:00 UTC 有多少毫秒,时间戳本身是时区无关的,它代表一个绝对的时间点。
Date.now() //1760688367597 现在的时间戳
二、时间戳的获取
1、Date.parse()
ECMA-262第5版定义了Date.parse()应该支持的日期格式:
❑ “月/日/年”,如"5/23/2019";
❑ “月名日,年”,如"May 23, 2019";
❑ “周几 月名 日 年 时:分:秒 时区”,如"Tue May 232019 00:00:00 GMT-0700";
❑ ISO 8601扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”,如2019-05-23T00:00:00(只适用于兼容ES5的实现)。
Date.parse("10/17/2025 11:35:00") //1760672100000
Date.parse('Oct 17, 2025') //1760630400000
2、Date.UTC()
传给Date.UTC()的参数是年、零起点月数(1月是0,2月是1,以此类推)、日(1-31)、时(0-23)、分、秒和毫秒。Date.UTC()获取的时间戳比Date.parse()获取的时间戳多8*60*60*1000毫秒,但是隐式调用没有这种问题。
Date.UTC(2025,9,17,11,35,0) //1760700900000
3、Date.UTC()和Date.parse()计算方式的区别
Date.UTC()得到的时间会晚8小时。
Date.UTC(2025,9,17,11,35,0)-Date.parse("10/17/2025 11:35:00") === 8*60*60*1000
//true
| 函数 | 它认为你输入的时间是... | 实际对应的 UTC 时间 |
|---|---|---|
Date.UTC(...) | UTC 11:35:00 | UTC 11:35:00 |
Date.parse(...) | 本地 11:35:00 (UTC+8) | UTC 03:35:00 |
Date.UTC()认为输入是 UTC,所以直接用 UTC 11:35:00 计算时间戳。Date.parse()认为输入是本地时间,所以它先转换为 UTC 03:35:00 再计算时间戳。
三、创建时间new Date()
1、不加参数时获取当前时间
new Date()
// Fri Oct 17 2025 15:20:44 GMT+0800 (中国标准时间)
2、加时间戳参数
new Date(1000)
//Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)
new Date()
//Fri Oct 17 2025 16:03:53 GMT+0800 (中国标准时间)
new Date(Date.now()+1000)
//Fri Oct 17 2025 16:03:54 GMT+0800 (中国标准时间)
new Date(Date.parse("10/17/2025 11:35:00"))
//Fri Oct 17 2025 11:35:00 GMT+0800 (中国标准时间)
new Date(Date.UTC(2025,9,17,11,35,0))
//Fri Oct 17 2025 19:35:00 GMT+0800 (中国标准时间)
3、加Date.parse()参数类型的参数
会隐式调用Date.parse()。
new Date("10/17/2025 11:35:00")
//Fri Oct 17 2025 11:35:00 GMT+0800 (中国标准时间)
相当于
new Date(Date.parse("10/17/2025 11:35:00"))
//Fri Oct 17 2025 11:35:00 GMT+0800 (中国标准时间)
4、加Date.UTC()参数类型的参数
new Date(2025,9,17,11,35,0)
//Fri Oct 17 2025 11:35:00 GMT+0800 (中国标准时间)
会隐式调用Date.UTC()。隐式调用默认传入的是本地时间。显式调用的时候输入的时间比真实时间晚了8小时,new Date()后获得时间也比输入时间晚8小时。
*例:本地时间9点,utc时间就为1点,本来new Date(Date.UTC( ** )) 应该输入1点(会输出得到9点),但是实际输入了9点,所以得到的时间就变成了17点。 *
new Date(Date.UTC(2025,9,17,11,35,0))
//Fri Oct 17 2025 19:35:00 GMT+0800 (中国标准时间)