React Native应用跨时区存储用户选择时间的技术问题咨询
解决React Native + SQLite跨时区时间存储与显示问题
问题场景
我之前在开发React Native应用时遇到了一个头疼的跨时区时间问题:用户在应用里选择一个时间,我把它以datetime类型存入SQLite数据库,支持后续编辑更新。同一时区下一切正常,但用户切换到其他时区后,数据库里的时间值会被自动调整,编辑界面显示的时间完全不对。
举个例子:用户选了上午7:00,数据库存的是Sun Oct 01 2017 07:00:00 GMT+0100 (BST),但切换到东京时区再编辑时,显示的就不是7:00了。
最开始我用这段代码构建存入数据库的日期:
var date = new Date(Date.parse('2017-10-01T' + hours + ':' + mins + ':00Z')); var _ofst = date.getTimezoneOffset() * 60000; date = date.getTime() + _ofst; // 存储date值
我知道手动加偏移量会导致偏差,但不加的话,本地时区会把显示时间改成上午8:00,用户体验直接崩了。
我的核心需求很明确(以选7:00为例):
- 屏幕始终正确显示用户所选的时间
- 数据库里要准确存储
Sun Oct 01 2017 07:00:00这个时间点 - 用户切换时区后,存储的时间值不会被调整,应用依然用这个时间来处理(比如触发通知)
我想找个规范的、不用字符串硬处理的方法来解决跨时区一致性问题。
最终解决方案:用moment.js统一处理时间
后来尝试用moment.js解决了这个问题,代码很简洁:
var date = moment('2017-10-01T' + hours + ':' + mins + ':00Z').utc().format();
这样存入数据库的日期是2017-10-01T07:00:00Z,完全没有时区偏移的干扰。从数据库取出的时候,再用同样的moment逻辑重构日期就行,测试下来不管切换到哪个时区,都能正常显示用户最初选择的时间,完美满足需求。
内容的提问来源于stack exchange,提问作者scgough
相关产品推荐
相关产品推荐

