本文正在参加「金石计划 . 瓜分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 总结
- UTC是协调世界时间,又称世界统一时间、世界标准时间。UTC是现在全球通用的时间标准。
- GMT(Greenwich Mean Time):格林威治时间。
- CST,即China Standard Time,表示中国标准时间(或者说北京时间)。
- 当UTC时间为0点时,中国CST时间为8点,因为零时区和中国北京时区相差8个时区,本地时间 = UTC标准时间+偏移量。