The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/pro/bin/perl

use strict;
use warnings;

# use POSIX qw( strftime );
use Tk;
use Tk::Clock;

my $m = MainWindow->new (-title => "World Clock");

my %TZ;
while (<DATA>) {
    if (m/^(\S+)\s+(GMT\S*)\s+(.*)$/) {
	$TZ{$1}   = [ $1, $2, undef, $3 ];
	$TZ{$2} ||= [ $1, $2, undef, $3 ];
	}
    if (m/^(.*?)(?:\s+\*)?\s+(GMT\S*)$/) {
	$TZ{$2} ||= [ $2, $2, undef, "" ];
	$TZ{$2}[2] ||= $1;
	exists $TZ{$TZ{$2}[1]} and
	    $TZ{$TZ{$2}[1]}[2] ||= $1;
	}
    }

# my $tz = strftime ("%Z", localtime);
foreach my $cd (
	[ "UCT",		"UCT",			"#ff0040"	],
	[ "Local",		$ENV{TZ}||"",		"Red"		],
	[ "London",		"Europe/London",	"OrangeRed"	],
	[ "Amsterdam",		"Europe/Amsterdam",	"Orange"	],
	[ "Moscow",		"Europe/Moscow",	"Yellow"	],
	[ "Tokyo",		"Asia/Tokyo",		"YellowGreen"	],
	[ "Los Angeles",	"America/Los_Angeles",	"Green"		],
	[ "New York",		"America/New_York",	"Turquoise"	],
	[ "Darwin",		"Australia/Darwin",	"Blue"		],
	[ "Catham",		"GMT+13:45",		"Violet"	],
	) {
    my ($city, $tz, $color) = @$cd;
    if (exists $TZ{$tz}) {
	$tz = $TZ{$tz}[1];
	$city = $TZ{$tz}[2];
	}

    my $c = $m->Clock (-background => "Black");
    $c->config (
	anaScale	=> 200,
	secsColor	=> "Green",
	tickColor	=> "Blue",
	tickFreq	=> 1,
	timeFont	=> "{Liberation Mono} 12",
	timeColor	=> "lightBlue",
	timeFormat	=> "HH:MM:SS",
	dateFont	=> "{Liberation Mono} 12",
	dateColor	=> "Gold",

	dateFormat => $city,
	timeZone   => $tz,
	handColor  => $color,
	);
    $c->pack (-side => "left", -expand => 1, -fill => "both");
    }

MainLoop;

__END__
ACDT	GMT+10:30	Australian Central Daylight Time
ACST	GMT+9:30	Australian Central Standard Time
ADT	GMT-3		Atlantic Daylight Time
AEDT	GMT+11		Australian Eastern Daylight Time
AEST	GMT+10		Australian Eastern Standard Time
AKDT	GMT-8		Alaska Daylight Time
AKST	GMT-9		Alaska Standard Time
AST	GMT-4		Atlantic Standard Time
AWDT	GMT+9		Australian Western Daylight Time
AWST	GMT+8		Australian Western Standard Time
BST	GMT+1		British Summer Time
CDT	GMT-5		Central Daylight Time
CEDT	GMT+2		Central European Daylight Time
CEST	GMT+2		Central European Summer Time
CET	GMT+1		Central European Time
CST	GMT+10:30	Central Summer(Daylight) Time
CST	GMT+9:30	Central Standard Time
CST	GMT-6		Central Standard Time
CXT	GMT+7		Christmas Island Time
EDT	GMT-4		Eastern Daylight Time
EEDT	GMT+3		Eastern European Daylight Time
EEST	GMT+3		Eastern European Summer Time
EET	GMT+2		Eastern European Time
EST	GMT+11		Eastern Summer(Daylight) Time
EST	GMT+10		Eastern Standard Time
EST	GMT-5		Eastern Standard Time
GMT	GMT		Greenwich Mean Time
HAA	GMT-3		Heure Avancée de l'Atlantique
HAC	GMT-5		Heure Avancée du Centre
HADT	GMT-9		Hawaii-Aleutian Daylight Time
HAE	GMT-4		Heure Avancée de l'Est
HAP	GMT-7		Heure Avancée du Pacifique
HAR	GMT-6		Heure Avancée des Rocheuses
HAST	GMT-10		Hawaii-Aleutian Standard Time
HAT	GMT-2:30	Heure Avancée de Terre-Neuve
HAY	GMT-8		Heure Avancée du Yukon
HNA	GMT-4		Heure Normale de l'Atlantique
HNC	GMT-6		Heure Normale du Centre
HNE	GMT-5		Heure Normale de l'Est
HNP	GMT-8		Heure Normale du Pacifique
HNR	GMT-7		Heure Normale des Rocheuses
HNT	GMT-3:30	Heure Normale de Terre-Neuve
HNY	GMT-9		Heure Normale du Yukon
IST	GMT+1		Irish Summer Time
MDT	GMT-6		Mountain Daylight Time
MESZ	GMT+2		Mitteleuropäische Sommerzeit
MEZ	GMT+1		Mitteleuropäische Zeit
MST	GMT-7		Mountain Standard Time
NDT	GMT-2:30	Newfoundland Daylight Time
NFT	GMT+11:30	Norfolk (Island) Time
NST	GMT-3:30	Newfoundland Standard Time
PDT	GMT-7		Pacific Daylight Time
PST	GMT-8		Pacific Standard Time
UTC	GMT		Coordinated Universal Time
WEDT	GMT+1		Western European Daylight Time
WEST	GMT+1		Western European Summer Time
WET	GMT		Western European Time
WST	GMT+9		Western Summer(Daylight) Time
WST	GMT+8		Western Standard Time

Addis Ababa	GMT+2
Adelaide	GMT+10:30
Aden		GMT+2
Algiers		GMT+0
Amman *		GMT+2
Amsterdam *	GMT+1
Anadyr *	GMT+12
Anchorage *	GMT-9
Ankara *	GMT+2
Antananarivo	GMT+2
Asuncion	GMT-5:00
Athens *	GMT+2
Atlanta *	GMT-5:00
Auckland	GMT+11
Baghdad *	GMT+3:00
Bangkok		GMT+6
Barcelona *	GMT+1
Beijing		GMT+7
Beirut *	GMT+2
Belgrade *	GMT+1
Berlin *	GMT+1
Bogota		GMT-6
Boston *	GMT-5:00
Brasilia	GMT-4
Brisbane	GMT+9:00
Brussels *	GMT+1
Bucharest *	GMT+2
Budapest *	GMT+1
Buenos Aires	GMT-4
Cairo *		GMT+2
Canberra	GMT+9:00
Cape Town	GMT+1
Caracas		GMT-5:00
Casablanca	GMT-1
Chatham Island	GMT+13:45
Chicago *	GMT-6
Copenhagen *	GMT+1
Darwin		GMT+10:30
Denver *	GMT-7
Detroit *	GMT-5:00
Dhaka		GMT+5
Dubai		GMT+3:00
Dublin *	GMT+0
Edmonton *	GMT-7
Frankfurt *	GMT+1
Geneva *	GMT+1
Guatemala	GMT-7
Halifax *	GMT-4
Hanoi		GMT+6
Harare		GMT+1
Havana *	GMT-5:00
Helsinki *	GMT+2
Hong Kong	GMT+7
Honolulu	GMT-11
Houston *	GMT-6
Indianapolis *	GMT-5:00
Islamabad	GMT+4
Istanbul *	GMT+2
Jakarta		GMT+6
Jerusalem *	GMT+2
Johannesburg	GMT+1
Kabul		GMT+5:30
Kamchatka *	GMT+12
Karachi		GMT+4
Kathmandu	GMT+6:45
Khartoum	GMT+2
Kingston	GMT-6
Kiritimati	GMT+13
Kolkata		GMT+6:30
Kuala Lumpur	GMT+7
Kuwait City	GMT+2
Kyiv *		GMT+2
Lagos		GMT+0
Lahore		GMT+4
La Paz		GMT-5:00
Lima		GMT-6
Lisbon *	GMT+0
London *	GMT
Los Angeles *	GMT-8
Madrid *	GMT+1
Managua		GMT-7
Manila		GMT+7
Melbourne	GMT+9:00
Mexico City *	GMT-6
Miami *		GMT-5:00
Minneapolis *	GMT-6
Minsk *		GMT+2
Montevideo	GMT-4
Montgomery *	GMT-6
Montreal *	GMT-5:00
Moscow *	GMT+3
Mumbai		GMT+6:30
Nairobi		GMT+2
Nassau *	GMT-5:00
New Delhi	GMT+6:30
New Orleans *	GMT-6
New York *	GMT-5
Odesa *		GMT+2
Oslo *		GMT+1
Ottawa *	GMT-5
Paris *		GMT+1
Perth		GMT+7
Philadelphia *	GMT-5
Phoenix		GMT-8
Prague *	GMT+1
Reykjavik	GMT-1
Rio de Janeiro	GMT-4
Riyadh		GMT+2
Rome *		GMT+1
San Francisco *	GMT-8
San Juan	GMT-5
San Salvador	GMT-7
Santiago	GMT-5
Santo Domingo	GMT-5
Sao Paulo	GMT-4
Seattle *	GMT-8
Seoul		GMT+8
Shanghai	GMT+7
Singapore	GMT+7
Sofia *		GMT+2
St. John's *	GMT-2:30
Stockholm *	GMT+1
St. Paul *	GMT-6
Suva		GMT+11
Sydney		GMT+9
Taipei		GMT+7
Tallinn *	GMT+2
Tashkent	GMT+4
Tegucigalpa	GMT-7
Tehran		GMT+4:30
Tokyo		GMT+8
Toronto *	GMT-5
Vancouver *	GMT-8
Vienna *	GMT+1
Vladivostok *	GMT+10
Warsaw *	GMT+1
Washington DC *	GMT-5
Winnipeg *	GMT-6
Yangon		GMT+7:30
Zagreb *	GMT+1
Zürich *	GMT+1