拨开时间的迷雾

2020-10-28  本文已影响0人  ThoughtWorks

DDD中最重要的一个过程就是统一语言。和客户沟通时间问题的时候,可以先把一些时间的概念统一一下。

每天早上9:00到公司,迟到要罚款;中午12:00去吃饭,慢了好吃的就没有了;晚上18:00要回家,晚了老婆不开心。

我们熟练的使用着时间,毕竟小学二年级课本上就开始讲时间了。

可时间究竟是什么?

看看大神的答案,本来可以理解的时间,一下子就糊涂了。人类文明探索了几千年,微观上看到了夸克交子,宏观上找到了黑洞,但是面对时间我们仍然不能给出确定的答案。

地球上的时间

大神考虑的内容要么是心理的,要么是宇宙的,要么就是微观的。其实我们了解地球上的时间就够了。

image

一般人都知道时区:为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议上,规定将全球划分为24个时区(东、西各12个时区)。

客户的疑问

有了时区,已经可以解决地球上一般问题了。但是面对全球业务的客户,他们还是会提出很多问题:

  1. 为什么要问我使用哪个时区显示时间?上游发给我们什么就显示什么呀?
  2. 计算两个时间差几天,为什么需要选择使用哪个时区?(客户的规则2019-01-01 23:59:59到2019-01-02 00:00:00,算一天)
  3. 上游给了时间和时区两个字段,我们存下来后,数据库里面显示也是正常的,为什么就没有时区了?

DDD中最重要的一个过程就是统一语言。和客户沟通时间问题的时候,可以先把一些时间的概念统一一下。

给客户建立这样的时间概念:**本地时间、时区、时区时间、绝对时间
**。

有一次我这样和客户讲:我们在北京看到的12点是北京时间12点,在伦敦看到的12点是伦敦的12点,那么如果我们在月球,看到的12点是什么呢?所以脱离了地球的24个时区,时间还是存在的,这种不因时区而变化的时间就是绝对时间。

有了这些基本概念后,围绕着这些基本概念解答问题,而且主要以举例子的形式讲解。

如果客户选择12:00,说明用户关心本地时间,系统应该使用事件发生地时区显示时间;

如果客户选择20:00,说明用户关心绝对时间,但是绝对时间没法显示,还是要选择一个时区,所以使用用户最舒服的时区,他自己的时区。

2019-01-01 23:59:59 UTC+8到2019-01-02 00:00:00 UTC+8,中间差一天;如果转换时区到UTC+7,就变成了2019-01-01 22:59:59 UTC+7到2019-01-01 23:00:00 UTC+7,中间差0天了。

image

客户追问:把本地时间和时区放在一起得到的数据,这个数据里面一定有时区呀?

答:这个过程就像2+8=10,但是通过10,无法找到2和8。计算机在存储绝对时间时做了类似的事情。

总结下来和客户沟通的主要手段就是:统一语言加举例子

程序员的时间

常见问题

1.java.util.TimeZone和java.time.ZoneId,这两个东西干什么的?有什么区别?

2.Australia/Canberra 和 UTC+11:00有什么区别?

OffsetDateTime对应UTC+11:00,固定偏移量;ZonedDateTime对应Australia/Canberra,偏移量不一定是固定的,对于Australia/Canberra一般是UTC+11,有时也会变成UTC+10。

ZoneId zoneId = ZoneId.of("Australia/Canberra");
ZonedDateTime start = LocalDateTime.of(2015, 10, 4, 1, 0)
      .atZone(zoneId);
ZonedDateTime end = LocalDateTime.of(2015, 10, 4, 3, 0)
      .atZone(zoneId);

System.out.println(MessageFormat.format("Start:\t{0}\nEnd:\t{1}\nDuration:\t{2}",
start, end, Duration.between(start, end)));

输出结果为

Start:2015-10-04T01:00+10:00[Australia/Canberra]
End:2015-10-04T03:00+11:00[Australia/Canberra]
Duration:PT1H

所以使用类似Australia/Canberra的这种ZoneRegion才能得到真正可靠的本地时间。

3.ZonedDateTime vs OffsetDateTime

4.GMT vs UTC
GMT,格林尼治标准时间(旧译“格林威治平均时间”或“格林威治标准时间”)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。

协调世界时(UTC) 英文:Coordinated Universal Time ,别称:世界统一时间,世界标准时间,国际协调时间, 协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简称UTC。

GMT的历史比UTC悠久,UTC出现后GMT就开始参考UTC时间,基本可以认为GMT=UTC。

5.Restful接口中建议使用Date、String、long来保存时间

com.alibaba.fastjson.JSON可以正常的将java.time中内容正确的保存和读取到json中;

com.fasterxml.jackson.databind.ObjectMapper保存的结果不理想。因此建议在restful接口中继续使用原始类型。

文/ThoughtWorks高玉山

上一篇 下一篇

猜你喜欢

热点阅读