拨开时间的迷雾


DDD中最重要的一个过程就是统一语言 。 和客户沟通时间问题的时候 , 可以先把一些时间的概念统一一下 。
每天早上9:00到公司 , 迟到要罚款;中午12:00去吃饭 , 慢了好吃的就没有了;晚上18:00要回家 , 晚了老婆不开心 。
我们熟练的使用着时间 , 毕竟小学二年级课本上就开始讲时间了 。
可时间究竟是什么?

  • 哲学家认为过去、现在、未来等时间概念只不过是人的幻觉 。
  • 牛顿说:绝对钟的读数就是时间 。
  • 爱因斯坦说 , 时间和空间一起 , 构成了被称为时空的实体 。
看看大神的答案 , 本来可以理解的时间 , 一下子就糊涂了 。 人类文明探索了几千年 , 微观上看到了夸克交子 , 宏观上找到了黑洞 , 但是面对时间我们仍然不能给出确定的答案 。
地球上的时间
大神考虑的内容要么是心理的 , 要么是宇宙的 , 要么就是微观的 。 其实我们了解地球上的时间就够了 。
拨开时间的迷雾
本文插图
一般人都知道时区:为了克服时间上的混乱 , 1884年在华盛顿召开的一次国际经度会议上 , 规定将全球划分为24个时区(东、西各12个时区) 。
客户的疑问
有了时区 , 已经可以解决地球上一般问题了 。 但是面对全球业务的客户 , 他们还是会提出很多问题:
  1. 为什么要问我使用哪个时区显示时间?上游发给我们什么就显示什么呀?
  2. 计算两个时间差几天 , 为什么需要选择使用哪个时区?(客户的规则2019-01-01 23:59:59到2019-01-02 00:00:00 , 算一天)
  3. 上游给了时间和时区两个字段 , 我们存下来后 , 数据库里面显示也是正常的 , 为什么就没有时区了?
DDD中最重要的一个过程就是统一语言 。 和客户沟通时间问题的时候 , 可以先把一些时间的概念统一一下 。
给客户建立这样的时间概念:本地时间、时区、时区时间、绝对时间 。
  • 本地时间:一般人讲的时间都是本地时间 , 它只在当地有效 。 类似2019-12-24 10:22 , 北京的这个时间和伦敦的这个时间可不是一个时间 。
  • 时区:使用相同本地时间的区域 。 类似Asia/Shanghai,America/Havana,为了便于理解我经常标记为UTC+8 , UTC-8 , 这两种标记方法并不等效 , 不是一个概念 , 客户一般不关心这个 , 不用说 , 程序员自己心里明白就好 , 后面讲差别 。
  • 时区时间:带有时区的时间 , 可以认为是可读的绝对时间 。 类似2019-12-24 10:22 (Asia/Shanghai),同样我也会写成2019-12-24 10:22 UTC+8 , 因为带有了时区信息 , 这些时间就可以在不同时区间转换了 。
  • 绝对时间:也可以叫时间戳 , 是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数 。 尽量少讲绝对时间 , 有些客户不太理解这个 。
有一次我这样和客户讲:我们在北京看到的12点是北京时间12点 , 在伦敦看到的12点是伦敦的12点 , 那么如果我们在月球 , 看到的12点是什么呢?所以脱离了地球的24个时区 , 时间还是存在的 , 这种不因时区而变化的时间就是绝对时间 。
有了这些基本概念后 , 围绕着这些基本概念解答问题 , 而且主要以举例子的形式讲解 。
  • 问题1:不同时区显示的时间不同 , 比如如果一个货物是在英国中午12:00发货 , 此时是中国的20:00 , 那么一个中国用户想要看到的是12:00还是20:00呢?
如果客户选择12:00 , 说明用户关心本地时间 , 系统应该使用事件发生地时区显示时间;
如果客户选择20:00 , 说明用户关心绝对时间 , 但是绝对时间没法显示 , 还是要选择一个时区 , 所以使用用户最舒服的时区 , 他自己的时区 。


推荐阅读