彻底搞懂UTC时间

我们可能经常听说UTC时间这一名词,但不知道它代表了什么意思,什么时候该用,前后端通信时使用UTC时间意味着什么。

为什么要使用UTC时间

对于前端同学,即便经常使用moment进行各种时间转换,也可能并不清楚UTC时间是什么,因为如果不涉及到跨国家和地区,实际上的确用不到UTC时间。

UTC时间的英文全称:Universal Time Coordinated,中文名称:协调世界时。

我们可以通俗的理解为,这个时间是全世界通用的,即全世界都公用的一个时间。这样,就很容易理解了,UTC时间实际上反映了一种约定,即为全世界所认可的一个统一时间,而不是某特定地区的时间。

UTC时间和本地时间是什么关系

UTC既然是世界公用的一个时间,那么我们本地时间和UTC时间就必然存在一个换算关系。按北京时间来算,北京时间将比UTC时间快8个小时

等等,既然是世界公用,为啥会说北京时间要快呢?不是该统一么?

的确,北京时区仍然承认UTC时间,但是不同时区在同一时间点,天色不不一样啊。

譬如,UTC时间是凌晨0点,这时北京时区也知道这时是UTC时间的0点,但是北京时区已经天亮了,处于我们日常的早上8点了。北京时区的确可以用UTC来计时,但与天色不一致,并不方便本时区居民的日常出行。因此不会按UTC时间的0点来说,而是按北京时间的8点来说。

这样,北京时区的计时就比UTC时间快8个小时,本质上是为了本地区居民的日常出行方便。

moment格式化默认是按啥

我们使用moment时,默认是按本地时间操作。

moment(1633742045202).format('YYYY/MM/DD HH:mm:ss');
// 2021/10/09 09:14:05 (北京时区)

调用moment格式化1633742045202这个时间戳时,是按用户所在的时区格式化的。本人所在的时区是北京时区,因此得到上面的结果。如果这段程序运行在另外一个时区,将得到不同的结果。

moment中UTC时间与本地时间的转换

在moment中,对时间戳转换成本地时间:

moment(1633742045202).format('YYYY/MM/DD HH:mm:ss');
// 2021/10/09 09:14:05 (北京时区)

将时间戳转换为UTC时间:

moment.utc(1633742045202).format('YYYY/MM/DD HH:mm:ss');
//   2021/10/09 01:14:05 (UTC)

上面案例中,同一个时间戳在不同时区(北京和UTC)表现的结果不同。因此,当得到时间戳时,可以根据需求转换成对应的时间。

需要指出的是,当调用moment.utc时,与用户本地时区没有关系,即无论用户在什么地方,都会得到相同的UTC时间。

前端获取当前时间的两种方案

前端可以通过两种方法来获取当前时间:

其一,通过js获取本地时间

moment().format('YYYY/MM/DD HH:mm:ss')

这个方法的缺陷是:这取决于这段代码运行在哪个时区,也就是与用户所在时区密切相关。并且,与用户本地时间密切相关,意味着如果用户改变了设备(如PC)上的本地时间设置,将得到完全不同的结果。

因此,这个方法仅适用于大概的判断,对于需要精确的判断时不适用。

其二,调用接口获取UTC时间,即由后端提供:

moment(serverTime).format('YYYY/MM/DD HH:mm:ss'); 
// serverTime为接口返回的服务器时间

这种方法可以防止用户所在时区不同以及修改本地时间导致的结果不同问题,也就是不依赖于用户本地时区和时间设置。

因此,该方法适合于精确判断的场景,对于测试则会稍显麻烦。

前端的时间判断

假设前端已经通过接口拿到当前的UTC时间戳A,如果我们需要判断当前时间A是否在时间B之前,该如何判断呢?

serverTime >= moment.utc('2021/10/09 00:00:00').valueOf();

// serverTime为服务器返回的当前UTC时间戳

这里moment.utc方法传入了具体的时间点,是准确的,也就是与用户的时区和本地时间设置无关。

以上代码将能够适应所有地区,并且能够防止时间作弊。

猜你喜欢

转载自blog.csdn.net/u012443286/article/details/120627322