对于刚入门开发的人员,常常是对时间的存储没有深刻去理解,而是代码执行符合预期了以后就不考虑了,遇到问题了再调整为符合预期,而后就无论了。程序员
缘由也很简单,没空,没耐心。可是却每次都有针对这个问题作临时解决方案。数据库
这里就记录我对时区的理解:开发
时间其实就是时间轴上的一个点。产品
咱们平时经过天然语言对时间作描述的时候,常常作不少的省略,只要接受信息的对方可以正确理解就够了。入门
譬如:程序
一、你12点的时候在哪里?时间戳
二、如今时间是 15:38分。统计
三、这条记录的建立时间是2018-01-19 21:19:33 。数据
第一条,咱们只说明了时间是12点,其它信息都是根据当前会话场景中来的;语言
第二条,咱们只说明了时间和分钟
第三条,咱们说明了不少信息,可是却没能严谨的肯定时间点,咱们遗失了时区的信息和 影响到时间精确度的毫秒值。
咱们平时在描述数据中准确描述时间的方式如:
一、1516368486378 ms
二、Fri Jan 19 2018 21:28:06 GMT+0800 (HKT)
三、2018-01-19T13:28:06.378Z
上面3个时间是3种描述时间的方式,描述的倒是同一个时间点,对于程序员来讲都不陌生 :
一、是一个精确到毫秒的时间戳
二、是一个带时区为东八区的时间格式
三、是一个ISO格式的时间
咱们在定义数据的时候不考虑存储消耗,把完整的时间存起来就ok了,其实没那么复杂。
而复杂的是,咱们常常在不理解的状况下,本能的要跟本身生活中时间的时间混淆,丢弃时区的信息。
理论上,咱们是不须要时区的,若是全世界都用同一个时间,那就没有那么多复杂的事情了,可是,人的行为跟一天中太阳的位置颇有关系,因此就须要比较直观的时间来知道当前是起床的时间仍是睡觉的时间。若是给一个这个时间 2018-01-19T13:28:06.378Z ,它是不带时区的,因此,东八区的人民就须要把小时加8才能知道对应的时间太阳在哪里。
因此,结论就是在数据中时间主要是要存储完整,不须要考虑时区,而时区是取决于看这数据的人。
例如:
你的数据库中存储了一个时间2018-01-19T13:28:06.378Z,而对于查看这个数据的人,你的显示是不同的,
对于东八区的人们,应显示2018-01-19 21:28:06
对于零时区的人们,应显示2018-01-19 13:28:06
对于西二区的人们,应显示2018-01-19 11:28:06
这个很号理解,数据是没有时区概念的,只有给看的人作显示的时候才有时区的概念。
例如:
产品给你提了一个须要,要求你统计上个月的总收入为多少?(咱们当前的时间为 2018-01-19 21:28:06 (东八区) )
分析:
产品要的时间数据时间为[2017-12-01 , 2018-01-01)
这个须要注意的是时区,产品的确切意图是以本身所在时区的以上时间,因此对应到 世界时间的时候,应该是[2017-12-01 08:00:00 , 2018-01-01 08:00:00 )
因此,咱们只须要统计[2017-12-01 08:00:00 , 2018-01-01 08:00:00 ) 时间段里面的全部订单的总额就能够了。
如何解决问题