多时区的全天概念概述
背景
公司准备出海,有些产品就得考虑全球的应用场景了,比如说一个中国人和一个美国人系统办公的事情,首先地理跨度就比较大,中间的时差问题就非常明显。
专业术语
标准时区:其实就是格林尼治时间,UTC时间。
本地时区:就是分处在各个地理位置上的时间,比如我们东八区,其实就是UTC 时间 +8为当地时间。
全天:一般意义上说的其实就是一整天,其实就是从0点到次日零点之间的时间段为通俗意义上的全天时间。
时差:其实就是不同时区之间的时间差值,比如说日本是东九区,我们是东八区,日本的时间就比我们早一个小时,在具体一点,在UTC时间为0点的时候,东八区的时间是8点,东九区的时间就是9点。
概念上的统一
如果大家都是同一个时区的,那么就没有统不统一的概念,因为大家本来就是一样的,所以我们讨论的场景仅仅是不同时区之间的场景。
我们其实天然的对时间不是很敏感,跟别人说一个时间的时候,如果跨了时区天然都是转换困难的。
本地时间,这个其实不光是一个数字的问题,周围的一切都会告诉你现在是几点,早上七八点太阳要出来,12点太阳要升到最高的位置,傍晚五六点太阳又要落下去。更重要的当地的人跟你说时间的时候都说的是当地时间。
所以,当你了解一件事情的时候,都是以自己的时间(一般是当地时间)为准的,就是我需要明确的知道,在我的时间里边,他是几点到几点。
另外还有一件事情很重要,你需要跟你的小伙伴交流的,所以他的时间也需要尊重,但是,如果你们两个还不在一个时区里边的话,再将原时间时间转换他的时区,这个转换就比较困难,所以一般跨时区讨论问题的时候,一般会说原始时区的时间,举个例子,你跟一个美国的同学要参加一个非洲同学的会议,那你跟美国同学确认的时候,就会说“那个非洲时间2点到3点的会议,你参不参加”。
具体要怎么表现

这个是钉钉的表现,其实看上去就蛮正常的,符合我们之前概念上的统一里边提到的,我的时间跟原始时间的概念。
这样大家就可以一块愉快的交流了。
全天概念歧义
全天这里其实我们有分歧,有的人认为一天是一整天,有人认为一天是一个具体的时间段。
概念上的冲突
一天就是一整天
一天就是一天,他的时间维度是以天为最小维度的,所以他是一个点儿而并不是一个时间段。
你看,我们之间虽然有时差,但是大家都是17号有什么问题,难道中国的17号跟美国的17号不是一个17号?
所以相对于存在一整天一类的概念上,其实我们标识为17号,然后说明他是一整天就完事了呗。
并且你看,虽然咱们之间有时差,但是真正有效的时间,其实就几个小时,这几个小时差得多的话,嗐大概率不重叠,那么一天的概念,其实具有一定的普适性,并且UI界面表现也很直接,如果你差了几个小时,你在日历上显示的时候,他究竟是 17号的呢?还是 18号的呢?还是 17 跟 18号呢?再加上一整天的属性,那么一天的日程不就变成两天了?
一天是一个时区的一整天
一天是当前时区的一整天也就是从0点到次日的0点,他其实是存在明确的时间段的概念的。
当我们存在于不同的时区的时候,他就应该按照普通的时间段来进行表示了,毕竟本身跨天的时间段这个概念肯定是存在的。
更深层的冲突

在探讨更深层的冲突之前,我们还是先来统一一下几个概念
全天,我们之前已经讲过了,一天的概念,其实是从0点到次日0点。但是你有没有想过,这两个0点是哪个时区的?其实是你所在时区的对不对,比如说北京时间0点,切换中国的日期。那如果你在日本的话,你是不是按照日本的0点来进行时间上的切换?他们中间差了1个小时哦,我说的一天,跟你在日本说的一天,已经差了一个小时了哦,如果我们把17号这个概念对应到这两个时区里边,他们去掉重叠的时间部分,其实已经是25个小时了。
换句话说,当你提及17号的时候,其实,你最多能在25个小时内提到今天是17号,那我们在扩大一下这个概念,当你现在是UTC时间的17号,他是24小时,当你往东移动一个时区,那么17号所代表的时间就会增加1小时,这样的兄弟东边还有11个,西边还有12个,这么算下来,其实你一共有49个小时说今天是17号?其实是48,因为+12 -12 是重叠的,理论上你可以认为他只能选一边,纯数学上来看的话,他们应该是中心左边跟右边,也就是 这个特殊的时区只有半个小时,当然实际情况要比这个复杂一点。
有点难理解是不是,其实我们可以借助工具来验证一下这个说法。
怎么验证呢?我们从UTC+12 的0点到 24点,然后从UTC-12 的0点到24点,然后取他们的最大值,看看总共的时长究竟有多少。
http://time.syiban.com/zhshiqu.html
看一下这个小工具

这个是UTC+12 的开始时间 也就是 UTC时间的 2025/12/16 12:00:00

这个是UTC+12 的结束时间 也就是 UTC时间的 2025/12/17 12:00:00

这个是UTC-12 的开始时间 也就是 UTC时间的 2025/12/17 12:00:00

这个是UTC-12 的结束时间 也就是 UTC时间的 2025/12/18 12:00:00
我们取所有时间的最小值 也 就是 2025/12/16 12:00:00 到最大值 也就是 2025/12/18 12:00:00
也就是2天,刚好48小时
一共有25个时区,其实跟意义上的一天24个小时,每个时区相差一个小时的通俗概念上来说说稍微有点不太一样,其实有25个时区,是UTC 时区 东经、西经各12个时区,所以一共有25个时区,那一天24个小时是怎么分出来25个时区呢?其实东12跟西12其实物理上是重叠的区域,也就是说,他们去掉日期只对比时间的话,其实是一样的,但是他们的日期缺整整相差了一天,也就是24小时。
既然你能理解,他们的时间相同但是他们的日期不同的概念的话,我们可以再举个详细一点的例子。

假设这里的A点是 UTC+12时区、B点事UTC-12时区,他们几乎是在同一个经度上,他们观察太阳几乎是一样的,但是他们两个差了整整一天。
那么,这个时候A点上的小a要请17号一整天的假,在B点上的小b是一个考勤管理员,从他本地时间删过来看,他会发现,Wow小a请了17号的假,但是小a 16号翘班了,17号反而来上班了。
这种问题,如果强制使用17号一天的概念统一全球,那么这个问题将无法调和。
所以,为了解决这个问题,应该如下处理:
1、如果当前时区内的时间一切如常处理,概念没有冲突
2、显示时间应该以当前用户人的时间为准,保留原始时间、原始时区概念
3、真正落库的时间使用标准化时间(不一定是UTC时间,时间就是时间而已,他只是一个时间点,UTC也好,东八也好,只是这个时间点的某一种表现形式),展示的时候再转换为需要的时间
4、如果跨时区了,如果觉得表现困难,那可以考虑跨时区的时候是时间段,本时区的时候才表现一整天的概念。

浙公网安备 33010602011771号