最近,我领导提出这样一个问题:如何保证不同时区的用户所看到的时间都是正确的?在之前的开发中时,我并没有思考过这个问题,所以当时还是陷入啦暂短的沉思之中。是的,因为时差是真实存在,所以需要进行时区转换,再进行显示。因此,实现之后,形成文字,以便回忆
关键思路
解决该问题的关键在于需要保证系统中使用的是同一时区的时间即可,通常以UTC时间,即零时区时间作参照物,展示时再转换成地方时即可。代码实例以数据库存储UTC时间为例,以date-fans为日期时间转换工具
Example
import { formatInTimeZone } from "date-fns-tz";
import { format, parseISO } from "date-fns";
/**
* @description 将服务端UTC时间转换为地方时
* @param utc '2022-01-10 09:49:38'
* @param fmt yyyy-MM-dd HH:mm:ss
*/
export const UTCToLocal = (utc: string, fmt = "yyyy-MM-dd HH:mm:ss") => {
if (!utc) return;
return format(parseISO(utc + "Z"), fmt);
};
/**
* @description 将客户端地方时转换为UTC时间
* @param dateTime Tue Jan 11 2022 17:58:58 GMT+0800 (中国标准时间)
* @param fmt yyyy-MM-dd HH:mm:ss
* 2021-2-11 00:00:00
* timeZones list: https://timezonedb.com/time-zones
* 获取当前本地timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
*/
export const localToUTC = (date: Date | string, fmt = "yyyy-MM-dd HH:mm:ss") => {
if (!date) return;
return formatInTimeZone(date, "Africa/Ouagadougou", fmt);
结尾
道虽迩,不行不至,事虽小,不为不成!