在Flutter时间应用中如何获取城市、所属国家及GMT时区信息?
解决本地时间应用的时区信息获取问题
方案1:从现有时区ID解析+DateTime获取GMT偏移
你通过flutter_native_timezone拿到的时区ID(如Asia/Shanghai)本身包含区域和城市信息,结合Dart的DateTime类就能获取GMT偏移:
import 'package:flutter_native_timezone/flutter_native_timezone.dart'; import 'package:intl/intl.dart'; Future<void> fetchTimezoneDetails() async { // 获取本地时区ID final timezoneId = await FlutterNativeTimezone.getLocalTimezone(); // 拆分时区ID提取区域和城市 final parts = timezoneId.split('/'); final region = parts[0]; final city = parts.length > 1 ? parts[1].replaceAll('_', ' ') : ''; // 获取GMT偏移字符串 final now = DateTime.now(); final offsetHours = now.timeZoneOffset.inHours; final gmtString = 'GMT${offsetHours >= 0 ? '+' : ''}$offsetHours'; // 输出结果 print('城市: $city'); print('区域/国家: $region'); print('GMT时区: $gmtString'); }
方案2:使用timezone包获取完整时区数据
集成timezone包(包含标准tz数据库),能更精准地获取时区相关信息:
- 先在
pubspec.yaml添加依赖:
dependencies: timezone: ^0.9.2
- 代码实现:
import 'package:flutter_native_timezone/flutter_native_timezone.dart'; import 'package:timezone/timezone.dart' as tz; import 'package:timezone/data/latest.dart' as tz_data; Future<void> initTimezoneInfo() async { // 初始化时区数据库 tz_data.initializeTimeZones(); final timezoneId = await FlutterNativeTimezone.getLocalTimezone(); final location = tz.getLocation(timezoneId); // 计算GMT偏移 final offset = location.currentTimeZone.offset; final gmtOffset = 'GMT${offset.inHours >= 0 ? '+' : ''}${offset.inHours}'; // 解析城市和区域 final parts = timezoneId.split('/'); final region = parts[0]; final city = parts.length > 1 ? parts[1].replaceAll('_', ' ') : ''; print('城市: $city'); print('区域/国家: $region'); print('GMT时区: $gmtOffset'); }
方案3:自定义时区-国家映射表
如果需要更精准的国家名称(比如将Asia映射为具体国家),可以维护一个自定义映射表:
// 示例映射表,可根据需求扩展 final Map<String, Map<String, String>> timezoneCountryMap = { 'Asia/Shanghai': {'city': 'Shanghai', 'country': 'China'}, 'Europe/London': {'city': 'London', 'country': 'United Kingdom'}, 'America/New_York': {'city': 'New York', 'country': 'United States'}, }; Future<void> getAccurateTimezoneInfo() async { final timezoneId = await FlutterNativeTimezone.getLocalTimezone(); final info = timezoneCountryMap[timezoneId]; final now = DateTime.now(); final offsetHours = now.timeZoneOffset.inHours; final gmtString = 'GMT${offsetHours >= 0 ? '+' : ''}$offsetHours'; print('城市: ${info?['city'] ?? 'Unknown'}'); print('国家: ${info?['country'] ?? 'Unknown'}'); print('GMT时区: $gmtString'); }
内容的提问来源于stack exchange,提问作者Junaid Aslam
相关产品推荐
相关产品推荐

