#!/usr/bin/perl -w use strict; use Time::Local qw( timelocal timegm ); use POSIX qw( strftime ); my $zid= '/usr/share/zoneinfo'; Main( @ARGV ); exit( 0 ); sub FindFiles { my( $av, $pref )= @_; $pref .= "/" if $pref; for( glob( "$pref*" ) ) { if( ! -l $_ && -d _ ) { FindFiles( $av, $_ ); } elsif( -f $_ ) { push @$av, $_; } } } sub Main { chdir $zid or die "Can't cd to $zid: $!$/"; my @zones; FindFiles( \@zones, '' ); @zones= [@zones]; my @parts= ( 00, 00, 12, 01, 00, 2004 ); my %s; for my $mo ( 0..11 ) { warn 'Month ',1+$mo,$/; my @new; for my $z ( @zones ) { $parts[4]= $mo; my %g; for my $zone ( @$z ) { $ENV{TZ}= $zone; my $time= timelocal(@parts); my $dif= $time-timegm(@parts); push @{$g{$dif}}, $zone; $dif /= 60*60; my $s= strftime("%Z",localtime($time)); $s{$zone}{"$dif $s"}= 1; } push @new, values %g; } @zones= @new; } warn 0+@zones, " unique zones.$/"; for my $z ( @zones ) { for my $zone ( @$z ) { print join( ' ', $zone, keys %{$s{$zone}} ), $/; } print $/; } }