UTC: 是啥东西

UTC: 是啥东西

本文正在参加「金石计划 . 瓜分6万现金大奖」

1 问题

最近兼职一个项目,后端反馈时间传值不对,大致看了下,只需要在el-date-picker组件上增加一行代码即可

<el-date-picker

      v-model="value"

      type="datetime"

      placeholder="选择日期"

      format="yyyy 年 MM 月 dd 日"

      value-format="yyyy-MM-dd">

</el-date-picker>
复制代码

稍微麻烦点的,可能就需要全局修改了

那么,2022-11-07T16:00:00.000Z 是啥呢,为啥和实际显示的2022年11月8日不同呢,而且为什么距离我们的时间相差8个小时?

带着这些问题,我们来学习下开发中的时间

2 分析

在element 官网中日期选择器 element.eleme.cn/#/zh-CN/com… 有日期格式一处地方,在这里有解释和相关demo

日期格式

使用format指定输入框的格式;使用value-format指定绑定值的格式。

默认情况下,组件接受并返回Date对象。以下为可用的格式化字符串,以 UTC 2022年11月14日 03:04:05 为例:

2.1 什么是UTC时间 

UTC指的是世界协调时间。

在GPS系统中有两种时间区分,一为UTC,另一为LT(地方时),两者的区别为时区不同,

UTC就是0时区的时间,LT为本地时间,如北京LT时间为早上八点(东八区),UTC时间就为零点。

UTC时间格式为:YYYY-MM-DDThh:mm:ssZ

例如,2022-11-11T12:00:00Z(为北京时间2022年11月11日20点0分0秒),这里距离北京时间相差8个小时

现在UTC才是标准参考,因此采用UTC和偏移量(Offset)的方式来表示本地时间:

本地时间 = UTC标准时间+偏移量。

注: 偏移量可表示为:UTC -或UTC +,后面接小时数,分钟数,例如:我们在东八区,北京时间=UTC+8:00。

中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8。

2.2 时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

所以这个总秒数/毫秒数全世界都是一样的,也就是说 Unix 时间戳和时区无关

2.3 开发过程中 

时间上的差异,在开发上难免会有一些问题,所以在开发过程中,我们需要了解项目是否仅仅在国内用,如果是,则用timestamp没有太大问题, 因为大家的linux服务器的时区是一样的

如果软件系统需要跨国服务,则必须用UTC(比如阿里云API),否则就会因为服务器的UTC时区不同,导致timestamp结果值混乱

2.2.1 如何获取UTC时间

以传统格式获取 UTC 时间

new Date().toISOString()
复制代码
new Date(Y, M, D, h, m, s)
复制代码

或者使用获取时间戳

Math.floor((new Date()).getTime() / 1000)
复制代码

2.2.4 获取时间格式yyyy-MM-dd hh-mm-ss

dayFormat(d) {

  const time = new Date(d);

  const month = (time.getMonth() + 1 < 10) ? `0${(time.getMonth() + 1)}` : time.getMonth() + 1;

  const day = (time.getDate() < 10) ? `0${time.getDate()}` : time.getDate();

  const h = (time.getHours() < 10) ? `0${time.getHours()}` : time.getHours();

  const m = (time.getMinutes() < 10) ? `0${time.getMinutes()}` : time.getMinutes();

  const s = (time.getSeconds() < 10) ? `0${time.getSeconds()}` : time.getSeconds();

}

复制代码

2.2.5 借用相关依赖包如moment.js或者day.js

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

const time = new Date().getTime();

console.log(time)

console.log(moment(time).format("YYYY/MM/DD HH:mm:ss"));

// 1669001255145 

// 2022/11/21 11:27:35 (北京时区)
复制代码

3 总结

  1. UTC是协调世界时间,又称世界统一时间、世界标准时间。UTC是现在全球通用的时间标准。
  1. GMT(Greenwich Mean Time):格林威治时间。
  1. CST,即China Standard Time,表示中国标准时间(或者说北京时间)。
  1. 当UTC时间为0点时,中国CST时间为8点,因为零时区和中国北京时区相差8个时区,本地时间 = UTC标准时间+偏移量。
分类:
前端