You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()前,手动强制同步系统时区:
    1. 引入win32依赖调用Win32 APIGetTimeZoneInformation读取当前系统时区
    2. 将读取到的时区信息赋值给进程环境变量Platform.environment['TZ']
    3. 强制刷新Dart时区缓存后再初始化应用
  • 需支持运行时动态修改时区的场景,可监听Windows系统WM_TIMECHANGE消息,收到消息后重新执行上述时区同步逻辑即可。

临时验证方法

在出问题的设备上打开命令提示符,依次执行以下命令验证是否为TZ环境变量导致的问题:

set TZ=
你的应用路径\app.exe

若执行后应用时间显示正常,即可确认根因为TZ环境变量缺失问题,按上述方案修复即可。

内容的提问来源于stack exchange,提问作者silver surfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:42:03