getCountryTimezones method

Future<Map<String, List<String>>> getCountryTimezones()

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),
  });
}