Вы можете использовать замечательный модуль DateTime для этого:
use strict; use warnings;
use DateTime;
# extract timezone name from file in env variable
(my $tz = $ENV{TZ}) =~ s#^/usr/share/zoneinfo/##;
my $now = DateTime->now(time_zone => $tz);
print "The current time is: " . $now->strftime('%F %T %Z') . "\n";
Когда я запускаю это с TZ = "/ usr / share / zoneinfo / Europe / Paris", я вижу:
Текущее время: 2010-04-19 20:09:03 CEST
Что касается извлечения данных о часовом поясе из файла пользователя: быстрое решение состоит в том, чтобы сохранить конфигурацию TZ этого пользователя в отдельном файле (который может быть создан .bashrc), и вы можете проанализировать его вручную в CGI (однако это другая тема: как лучше всего хранить индивидуальные конфигурации для CGI?)
# /home/<user>/.tz should have the content: export TZ="/usr/share/zoneinfo/timezonename"
open(my $tz_fh, "/home/${user}/.tz");
chomp(my $tz_data = <$tz_fh>);
close $tz_fh;
(my $tz_path) = $tz_data =~ m/^export TZ\s*=\s*"(.+)"$/;
# now $tz_path contains what $ENV{TZ} would contain in the earlier code snippet.