getCountryTimezones method
ISO 3166-1 alpha-2 code to sorted list of IANA timezone names for that
country. Prefers zone1970.tab (which supports multi-country zones) and
falls back to zone.tab.
Implementation
Future<Map<String, List<String>>> getCountryTimezones() async {
if (_countryTimezones != null) return _countryTimezones!;
final zone1970 = File('$_zoneinfoDir/zone1970.tab');
final zone = File('$_zoneinfoDir/zone.tab');
final File source;
if (await zone1970.exists()) {
source = zone1970;
} else if (await zone.exists()) {
source = zone;
} else {
throw FileSystemException('tzdata not installed', zone1970.path);
}
final result = <String, List<String>>{};
for (final line in await source.readAsLines()) {
if (line.isEmpty || line.startsWith('#')) continue;
final parts = line.split('\t');
if (parts.length < 3) continue;
final codes = parts[0].split(',');
final tz = parts[2].trim();
if (tz.isEmpty) continue;
for (final raw in codes) {
final code = raw.trim().toUpperCase();
if (code.isEmpty) continue;
(result[code] ??= <String>[]).add(tz);
}
}
for (final list in result.values) {
list.sort();
}
return _countryTimezones = Map<String, List<String>>.unmodifiable({
for (final entry in result.entries) entry.key: List<String>.unmodifiable(entry.value),
});
}