如何在Flutter中创建不受夏令时、手机时区变动影响的指定时区DateTime?
解决方案
你要实现不随本地时区变动、不受夏令时影响的指定时区时间转换,直接通过timezone包的Location实例构造对应时区的时间即可,无需手动计算偏移。
现有代码的问题
- 获取
currentTimeZone.offset仅能拿到目标时区当前时刻的偏移量,若转换的时间处于夏令时切换前后的其他时间节点,偏移值会不准确,导致最终时间出错 - 手动处理偏移加减的逻辑冗余,容易出现符号处理错误
- 依赖本地TZDateTime构造的逻辑会受手机本地时区变动影响,不符合需求
修正后的实现代码
try { // 1. 先解析输入的日期字符串为不携带时区信息的朴素时间 DateTime naiveDt = DateFormat(format).parse(date); // 2. 从本地存储读取目标时区标识 String targetTimeZone = sharedPreference.getString(Constants.PREF_TIMEZONE); // 3. 获取目标时区的Location实例 final targetLocation = tz.getLocation(targetTimeZone); // 4. 直接构造目标时区的TZDateTime,完全基于目标时区规则,不受本地时区、夏令时切换影响 final targetTZDT = TZDateTime( targetLocation, naiveDt.year, naiveDt.month, naiveDt.day, naiveDt.hour, naiveDt.minute, naiveDt.second, ); // 5. 返回对应的毫秒时间戳即可 return targetTZDT.millisecondsSinceEpoch; } catch (e) { Utility.log(e); // 异常场景可按需返回默认值 return null; }
补充说明
- 该实现直接基于你指定的目标时区规则生成时间,只要存储的目标时区标识不变,无论手机本地时区怎么修改,最终生成的时间都不会变动
- timezone包内置了完整的时区数据库,会自动按目标时区的规则处理夏令时,不需要手动调整偏移
内容的提问来源于stack exchange,提问作者Ritesh kumar tiwari
相关产品推荐
相关产品推荐

