问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

时区那些事儿

发布网友 发布时间:2022-11-25 04:05

我来回答

1个回答

热心网友 时间:2023-10-08 18:06

摘要:本文总结几类项目中跟时区相关的问题,给大家分享一些基本的时区知识,以及如何在软件开发和测试中注意考虑时区因素,以避免因时区而导致系统功能的问题。

(原文: 时区那些事儿 )

蓝鲸项目的小Q和小D说的是啥呢?下面先来借助维基百科的解释来介绍时区和UTC的概念:

原来小Q和小D所在的蓝鲸项目正在开发一个全球性的系统,用户处于世界各地的不同时区。

系统的工单处理流程中每个任务的完成因为有先后依赖关系,当时记录的是完成时刻的UTC时间,以防不同时区的用户完成依赖任务的时候产生冲突。

比如:处于UTC+0800时区的用户S在当地时间 2019-02-28 09:30 处理了任务1,系统记录的时间是 UTC 2019-02-28 01:30 ,接下来处于UTC-0800的用户G在当地时间 2019-02-27 18:20 来处理任务2(必须晚于任务1完成),系统记录的是 UTC 2019-02-28 02:20 ,这个时间就不会有问题。

在处理某个任务的时候如果发现有信息缺失,需要记录发现和收集到缺失信息的时间(可以是过去时间,由用户输入),而这个发现和收集完成的时间一般都是同一个用户来记录,本身不会有时区问题,另外这个时间跟工单处理流程中的任务完成时间并没有特别直接的关系,就对缺失信息部分只记录由用户输入的日期,而且是直接记录用户当地时间的日期,并没有记录时分秒,也没法根据UTC进行转换。

这样,同一个日期,比如,在东部时区的 2019-04-28 可能就是西部时区的 2019-04-27 ,在西部时区的 2019-04-28 可能就是东部时区的 2019-04-29 ,前后有相差一天的可能性。

但是,在做到KPI功能的时候,计算KPI需要结合工单任务处理时间和缺失信息记录时间,由于没有考虑时区问题,不同时区可能会造成KPI有一天的误差。

这又是为什么呢?大家都在焦急地等待小D的解释。

原来,对于这种没有时分秒要求的时间,我们系统统一用当天中午UTC的12:00存入DB,这样做的原因是保证-12~+12时区内都不会有问题,换算以后都是当天,但是没有考虑到正负13、14区的情况。

下面我们来举例说明为什么东14区的会有问题。

假设用户A和用户B分别处于东12区和东14区,A和B分别在当地时间的2019年04月28日的上午9:00签订了合同,那么系统记录的时间都是 UTC 2019-04-28 12:00 ,在用户A的页面上显示的日期是 2019-04-28 ( UTC 2019-04-28 12:00 转换东12区的时间是 2019-04-28 24:00 ,这个时间的日期还是4月28日),而在用户B的页面上显示的日期应该是 2019-04-29 ( UTC 2019-04-28 12:00 转换东14区的时间是 2019-04-28 26:00 ,也就是 2019-04-29 02:00 ,这个时间的日期变成了4月29日)。

如下表,用户A、B、C、D的合同签订时间都是当地时间2019年04月28日的上午9:00:

同理,用户C和D处于西部时区,从上表我们可以看到处于-12的C的时间是跟实际日期一样,而处于-13的用户D的时间则比实际时间早了一天,也是有问题的。

至此,我们明白了为什么东14区会引起系统功能有问题。但是,一直以来以为时区都在正负12之间,为什么会有大于+12的时区呢?原来小D是早就知道的,他给我们解释了是下面两个原因:

其实,时区还有很多有意思的,有偏移量是半个小时的(如印度),还有45分钟的(如尼泊尔),不一定都是整点。更多详情可以参考维基百科的 时区列表 。

这个问题听起来很简单,直接在DB里把对应的时区改一下就ok了。可是,正当小D准备去改数据的时候,发现了一个崩溃的事情:伊斯坦布尔和明斯克还跟另外两个地区的时区是绑定在一起的,见下图。当前系统中已经设置好的一些会议,没法判断真正需要的是哪个地区对应的时区... 已有数据无法修复!

在此先不解释如何修复的数据问题。

当时,我们正好要把时区引入到另外一个新系统,考虑到避免再出现类似的情况,采用了一个新的库,那就是每个地区对应一个时区。比如:GMT+08:00分别有上海、乌鲁木齐、重庆、香港、新加坡等时区。

原来,这个时区表示法里时区名字都是用“区域/位置”来表示,比如“Asia/Shanghai”,而前面的“(GMT+08:00)”是表示相对于GMT的一个偏移量。前面对话中提到的“Etc/GMT-8”只是时区名字而已。那为什么叫这么奇怪的名字呢?

下面引用 维基百科 的解释来说明:

对于国际化的软件系统来说,时区还是需要特别关注的。根据所经历项目出现的时区相关问题,尝试总结以下几点供大家参考。

开发方面

测试方面

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
石料加工服务可以全部交给第三人完成吗 山东沃尔德集团集团所辖公司介绍 齐鲁银行无忧贷和市民贷哪个好 什么叫补按揭 后按揭贷款什么意思 买房者续按揭有什么危害 加按揭是什么意思 八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 九月十日教师节感谢老师锦旗用语大全 济商高速征地补偿标准 澄商高速为什么烂尾 固商高速有多少个隧道 宣商高速2022金寨县开工时间 济商高速今年能开工吗 宣商高速2022年何时开工 消防报警系统线路图 求助,这张图(消防报警线路图)的线路该怎么连 有什么办法能让鲜绿色破布鞋变浅绿? 刚买的破布鞋颜色好艳 我想让它褪色成浅绿色 怎么办?有大师能教教我 充电宝灭屏充电手机重启 九头鱼做饼怎做法 怎么做九头鱼 九头鱼的做法 提醒谈话,警示谈话,批评教育哪个更严重? 安徽司尔特肥业是上市公司吗? 关于食素,这些问题你绝不该忽视? 不正确的吃素会对这里造成伤害,这些调理方法,快看看 吃素也要有技术含量,吃的不对,再素也白搭 腿筋疼是什么原因 腿肚筋疼怎么了? 四季豆一定要焯水吗 制作四季豆需要焯水吗 重庆国贸豪生大酒店的重大事件 时之笛怎么绳钩拿后出不去 延绳钩于延绳留多长距离 105型豆浆机过滤网可以用在108型上吗 飞利浦AC4026空气净化器更换哪种型号过滤网 微晶石地砖与玻化砖哪个比较好?主要看装饰效果和质量 世界上怎么会有思美这样恶心的股票 梦见坟地工坊 自制阿胶糕的做法 拼多多里的官方旗舰店是正品吗?问一下你们买的东西是正品吗 古代举人、进士、二举、三红、探花的区别是什么? 梅雨季节衣服晾臭了怎么办 梅雨季节衣服晾臭了解决方法 梅雨季节衣服不干该怎么办 有哪些令人绝望的物理定律 为什么说波粒二象性是世界上最恐怖的东西? 举个栗子!Tableau技巧(4):如何做空心饼图(环形图) 干黄酱和黄豆酱的区别,外观/颜色/吃法/加工方式都不一样 黄酱和黄豆酱是一样的吗。 为什么要拔牙,以及拔牙后有什么要注意的