#!/usr/bin/perl { use 5.006; } use warnings; use strict; use Time::OlsonTZ::Data qw(olson_canonical_names olson_tzfile); use DateTime::TimeZone::Tzfile (); my %abbr; foreach my $zonename (keys %{olson_canonical_names()}) { my $zone = DateTime::TimeZone::Tzfile->new(olson_tzfile($zonename)); # icky dependence on DT:TZ:Tzfile internals, # liable to break on future versions of DT:TZ:Tzfile foreach my $obs (@{$zone->{obs_types}}) { next unless ref($obs) eq "ARRAY"; my($offs, undef, $abbr) = @$obs; my $arec = $abbr{$abbr} ||= { offsets=>{}, zones=>{} }; $arec->{offsets}->{$offs} = undef; $arec->{zones}->{$zonename} = undef; } } foreach my $abbr (sort keys %abbr) { my $arec = $abbr{$abbr}; print $abbr, ": ", join(" ", map { my $neg = $_ < 0; my $mag = abs($_); use integer; my $txt = sprintf("%s%02d:%02d:%02d", $neg ? "-" : "+", $mag/3600, $mag/60%60, $mag%60); $txt =~ s/(?::00)+\z//; $txt; } sort { $a <=> $b } keys %{$arec->{offsets}}), " (", join(" ", sort keys %{$arec->{zones}}), ")\n"; } exit 0;