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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:18:02