用户场景

国际版中各个仓库分属不同的城市,不同的城市所在时区不同,基于各个角色对数据的使用情况不一样
主要的用户场景
库内作业人员,仓库是纽约仓,时区是UTC-05:00,查询2017-12-12017-12-10的仓库入库单。即查询的是2017-12-1 00:00:00-05:002017-12-10 23:59:59-05:00 时间区间内创建的入库单。在查询结果显示的时候,时间数据也需要转换到纽约时区。
上游系统,比如OMS的系统调用。客户拥有两个仓库,分别在不同的城市。比较典型的是下单时间。下单时间由客户的ERP系统创建,对于不同仓库的订单,在各自的仓库内展现时,是按仓库所在城市来显示。
跨仓库的报表。勾选多个仓库,执行查询时,展示的时间,仍是以各自仓库所在城市时区展示。
操作仓库无关的资源。比如域内的用户资源。比如域管理员新建用户账户,同时要设置该用户的有效时间为2018-11-10 ~2018-11.15日,这个是依据客户端时区设置的。

设计方案

为了更好的讨论问题,对几个时区做下约定:

简称 说明
localtime,localzone 表示客户端时间和时区
whtime,whzone 表示仓库时间和时区
apptime,appzone 表示应用服务器的时间和时区
dbtime,dbzone 表示数据库的时间和时区
3rdtime,3rdzone 表示第三方系统的时间和时区,如GOMS或ERP

按照以上的场景介绍,localzone只有在操作域资源的时候会涉及。在操作仓库资源的时候,均使用whzone。

appzone和dbzone均会设置成UTC+00:00,因为timestamp存储范围的原因,故不考虑。所有时间数据均保存为datatime。3rdzone则依赖实际情况,可能和appzone相同,也可能不同。
第一种方案是所有的时间均转化为UTC+0的时间再保存。第二种方案比较取巧,在保存的时候就考虑之后的显示,比如在纽约仓库的操作是2017-12-26 15:00:00-05:00 这个绝对时间发生的,保存的时候保存为2017-12-26 15:00:00-00:00,所以在保存的时候会有2017-12-26 15:00:00-05:00~2017-12-26 15:00:00-00:00的转化操作。

场景 方案1(记录UTC0时间) 方案2(记录仓库时间)
订单创建时间 后台生成系统时间(appzone) 1.获得应用服务器当前时间(apptime:2017-12-26 15:00:00+00:00)2.获得订单对应仓库的时区(whzone:+08:00)3.将apptime进行时区偏差处理,获得时间2017-12-26 23:00:00+00:00
订单下单时间(3rdzone=appzone) 不需要转化 1.获得订单对应仓库的时区(orderTime: 2017-12-26 15:00:00+00:00 whzone +08:00)2.将下传的订单时间转化为仓库本地时间(whtime:2017-12-26 23:00:00+00:00)
订单下单时间(3rdzone!=appzone) 将上游系统时区转化到WMS时区(appzone) 1.将上游系统时区转化到WMS时区(orderTime: 2017-12-26 15:00:00+08:00 3rdzone: +08:00 appzone:+00:00)2.获得订单对应仓库的时区(whzone: -05:00)3.将下传的订单时间转化为仓库本地时间(whtime:2017-12-26 2:00:00+00:00)
仓库操作,查询条件中有时间 1.将查询时间转化为UTC0时间(whzone->appzone)(2017-12-26 12:00:00-05:00 ->2017-12-26 17:00:00-00:00) 1.不需做转化其实还是需要转化的,除非客户上传的是不带时区的字符串,服务器当0时区的来处理
时间数据展示 1.将UTC0时间转化为仓库时间(appzone->whzone)(2017-12-26 17:00:00-00:00->2017-12-26 12:00:00-05:00 ) 1.不需要转化.其实还是需要转化的,除非服务端输出的是不带时区的字符串,客户端直接显示字符串

另外,在时间格式化的问题上,也存在两种意见,一种是前台处理,一种是后台处理。如果上面采用方案2,那么只能采用后台处理,因为在方案2中,客户端是不会使用仓库时区数据的。客户端服务端之间交互时,使用的都是不带时区的字符串。所以在讨论是前台处理还是后台处理的时候,是假设上面采用了方案1.

场景 前台处理 后台处理
登录时 1.后台给前台offsite = whzone - appzone。比如前台的仓库是纽约,则偏差是 -5h
仓库操作,查询条件中有时间 1.前台将查询条件依据offsite处理成long。2.后台用long生成Date对象 1.前台上传时间字符串2.后台获取仓库的时区信息3.转化为UTC0的时间
时间数据展示 1.后台返回long。2.前台依据offsite,转化为要显示的字符串 1.获取仓库的时区信息。2.转化为仓库的时间字符串
优点 1.后台处理不涉及任何时间转换处理,均是utc0的时间。2.前台能更好的结合多语的格式配置。3.更好利用富客户端的计算资源。  
缺点 1.客户端需要处理whzone,localzone,以及appzone之间的转化。在登录的时候,会返回whzone和appzone的偏差值,客户端需要使用该偏差值处理localzone  

原文地址:https://segmentfault.com/a/1190000012611095

国际版多时区设计方案【转】相关推荐

  1. 阿里云国际版云计算应用在企业领域的优势有哪些

    云服务提供商是提供基于云的平台.基础设施.应用程序或存储服务的第三方公司.企业可根据业务需求对所需的云服务按需付费. 1. 阿里云国际版云计算应用在企业领域的优势 (1)成本 云计算无需投资软硬件以及 ...

  2. 阿里云国际版ACE与国内版ACE区别

    1.国际版ACE与国内版ACE有哪些不同 2.国际版ACP/ACE约考流程 2.1 登录VUE官方网站约考 https://www.pearsonvue.com.cn/Clients/Alibaba- ...

  3. 云应用程序架构:阿里云国际版服务器托管注意事项

    传统Web托管中的通用应用程序或Web应用程序通常总是被证明是一个挑战.无论是设计结构还是可扩展的架构,以支持趋势和需求.典型的宿主方案遵循三层体系结构,并将其划分为表示层.持久性层和应用层.借助内置 ...

  4. win10鼠标灵敏度怎么调_和平精英最稳压枪灵敏度怎么调教程,适合所有段位以及适合国际版PUBG手游压枪...

    和平精英(原刺激战场)主播最稳压枪灵敏度怎么调?不妨看看花了五个小时调试的最稳和平精英压枪灵敏度吧. 废话不多,上图按照调.保证你满意,你离主播只差点意识 此和平精英压枪灵敏度适合所有段位  也适合P ...

  5. 顺F速运国际版,你的密码漏点了

    "  对顺F旗下各APP顺藤摸瓜分析--顺F速运国际版." 前文<顺F速运,你被爱加M坑了>提到,顺F速运APP使用爱加密加壳,流量中传输内容被加密并BASE64编码了 ...

  6. 360压缩电脑版_360压缩国际版

    点击蓝字 关注我们 360zip是360压缩推出的国际版压缩软件,对比原版360压缩,360zip的界面更加清新,并且软件不附带任何广告,不像使用360压缩时不时会弹出广告,简单来说更像是一个无广告版 ...

  7. Ubuntu14.04下安装wineqq国际版和卸载QQ

    转载自: http://www.bubuko.com/infodetail-343048.html http://jingyan.baidu.com/article/e9fb46e199d60d752 ...

  8. Azure 国际版与中国版服务列表对(2020年6月版)

    点击上方关注"汪宇杰博客" ^_^ 对于选择Azure平台的用户来说,会面临选择国内还是国际版的问题.由于一些原因,由世纪互联运营的中国大陆版Azure无法落地所有的国际版服务.相 ...

  9. 微博 Android 启动广告,使用Xposed去除微博国际版的启动广告

    本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次. 前面有篇文章已经介绍了如何创建Xposed模块的文章了,这篇就让我们来实现一个简单的去除启动广告的功能吧. 起因 为什么要是要去掉微博国际版 ...

  10. 二代CMS旅游网站程序国际版开发中(支持英文、法文等),支持拓展语言包

    二代CMS旅游网站程序国际版开发中(支持英文.法文.德文等),支持拓展语言包,理论上可以拓展成任何一种语言,前端和后端都支持在线语言切换,前端还支持支付货币的币种切换,敬请期待! 转载于:https: ...

最新文章

  1. python函数使用易错点_大部分人都会忽略的Python易错点总结
  2. MIT自然语言处理第三讲:概率语言模型
  3. (转)gLFlush()和gLFinish()
  4. 逻辑综合——概述与基本概念
  5. Java调试器和超时
  6. php实现关键字搜索mysql数据_PHP实现多个关键词搜索查询功能示例
  7. 月薪20k的web前端开发程序员,他们都会的这6招
  8. python2.7安装pygame_python 安装 pygame了
  9. JavaScript声明全局变量的三种方式
  10. 【转】缺少servlet-api.jar包
  11. animation 循环_(五)实践出真知——Python 之定时器、线程、动画制作Animation类...
  12. 鼠标右键菜单及图标添加
  13. 2022最新谷歌商店上架流程_google play 上架流程
  14. 新版itunes添加铃声
  15. 13. 查询表orders——统计销售总量大于50的各类商品的ID和销售总量
  16. [转] 记住亦舒的话
  17. 老大说不要在项目中使用存储过程
  18. 做UI设计需要具备什么技能
  19. 实现一个操作系统系列2-《操作系统真象还原》BIOS启动
  20. 谈谈反爬虫“政策与对策”

热门文章

  1. yolo-v5连接手机摄像头实时检测的步骤
  2. 计算机网络定义来源,计算机网络基础知识之计算机网络定义及其功能
  3. ffmpeg 将拆分的数据合成一帧_FFMPEG 视频分割和合并
  4. selenium.common.exceptions.WebDriverException:Message: 'chromedriver' executable needs to be in PATH
  5. 伸缩Kubernetes到2500个节点中遇到的问题和解决方法
  6. Android零散技术点
  7. Java中的内存处理机制和final、static、final static总结
  8. Java连接MySQL数据库及简单操作代码
  9. SCVMM 2012 R2---添加Hyper-V虚拟机
  10. 发送带嵌入图片邮件之SMTP实现和ESMTP实现