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
相关产品推荐
相关产品推荐

