Flutter中DateTime.now()在同时区不同Windows设备返回值不一致问题
Flutter Windows 打包后
DateTime.now()返回UTC问题分析与修复 根因说明
- 这是Flutter 3.13版本前的已知框架缺陷:debug模式下Dart VM会优先读取系统时区配置,release打包后默认会读取进程
TZ环境变量作为时区依据,若设备未配置该变量会直接 fallback 到UTC时区,与系统实际时区配置无关。 - 应用启动后才修改系统时区的场景下,Dart VM默认不会监听系统时区变更事件,会一直沿用启动时读取的时区配置,也会出现时间与系统不同步的问题。
- 部分精简版Windows、权限受限的企业域控设备,应用启动时无法正常读取时区注册表项,也会触发UTC fallback逻辑。
修复方案
- 优先升级Flutter SDK到3.13及以上稳定版,该版本已修复Windows release模式时区读取逻辑,不再依赖
TZ环境变量,启动时强制读取系统当前时区配置。 - 无法升级版本的场景可在
main函数执行runApp()前,手动强制同步系统时区:- 引入
win32依赖调用Win32 APIGetTimeZoneInformation读取当前系统时区 - 将读取到的时区信息赋值给进程环境变量
Platform.environment['TZ'] - 强制刷新Dart时区缓存后再初始化应用
- 引入
- 需支持运行时动态修改时区的场景,可监听Windows系统
WM_TIMECHANGE消息,收到消息后重新执行上述时区同步逻辑即可。
临时验证方法
在出问题的设备上打开命令提示符,依次执行以下命令验证是否为TZ环境变量导致的问题:
set TZ= 你的应用路径\app.exe
若执行后应用时间显示正常,即可确认根因为TZ环境变量缺失问题,按上述方案修复即可。
内容的提问来源于stack exchange,提问作者silver surfer
相关产品推荐
相关产品推荐

