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

Flutter timezone包获取开罗时间异常:返回设备时间而非目标时区时间

问题分析与解决办法

问题根源

tz.TZDateTime.now()的设计逻辑就是基于设备本地系统时间计算对应时区的时间,它不会主动请求网络获取真实的标准时间。所以如果设备本地时间被修改,返回的开罗时间自然会跟着出错。

解决思路

要获取不受设备时间影响的真实开罗时间,必须通过网络请求获取标准UTC时间,再转换为开罗时区的时间。

具体实现代码

import 'package:http/http.dart' as http;
import 'package:timezone/timezone.dart' as tz;
import 'dart:convert';

Future<tz.TZDateTime> getRealCairoTime() async {
  tz.initializeTimeZones();
  final egyptTimeZone = tz.getLocation('Africa/Cairo');

  // 请求世界时间API获取开罗时区的标准时间
  final response = await http.get(Uri.parse('http://worldtimeapi.org/api/timezone/Africa/Cairo'));
  if (response.statusCode == 200) {
    final data = jsonDecode(response.body);
    // 解析UTC时间并转换为开罗时区时间
    final utcTime = DateTime.parse(data['utc_datetime']);
    return tz.TZDateTime.from(utcTime, egyptTimeZone);
  } else {
    throw Exception('无法获取标准时间,请检查网络连接');
  }
}

补充说明

  • 该方案依赖网络,需处理无网、请求失败等异常场景
  • 若不想依赖第三方API,可自行搭建后端接口返回标准UTC时间
  • 原代码的tz.TZDateTime.now()本身没有问题,只是它的定位就是基于设备时间做时区转换,并非获取网络标准时间

内容的提问来源于stack exchange,提问作者khaled mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:00:34