У меня есть сервер, где системный часовой пояс EST
Он был установлен с
# timedatectl set-timezone EST
# timedatectl
Local time: Tue 2019-06-18 03:29:42 EST
Universal time: Tue 2019-06-18 08:29:42 UTC
RTC time: Tue 2019-06-18 08:29:42
Time zone: EST (EST, -0500)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
Затем в моем perl коде я пытаюсь определить часовой пояс и преобразовать время в UTC.
И по какой-то причине часовой пояс определяется как EDT. В настоящее время (лето) EST является одним из наших после EDT
Мой код Perl
# cat test.cgi # code file is named test.cgi
#!/usr/bin/perl -w
use Date::Manip;
print "Local time: ".UnixDate("now","%Y-%m-%d %H:%M:%S %Z")."\n";
# get local system timezone
my $TZ = UnixDate("now","%Z");
# convert time to GMT
my $dtlocal = Date_ConvTZ(ParseDate(UnixDate("now","%g")),$TZ,"GMT");
# format GMT time
my $dt = UnixDate($dtlocal,"%Y-%m-%d %H:%M:%S");
print "Timezone: $TZ\n";
print "UTC time: $dt\n";
И я выполняю сценарий
# date
Tue Jun 18 04:17:56 EST 2019
# date -u
Tue Jun 18 09:17:58 UTC 2019
# ./test.cgi
Local time: 2019-06-18 04:18:00 EDT
Timezone: EDT
UTC time: 2019-06-18 08:18:00
В чем может быть причина того, что Date :: Manip неправильно определяет часовой пояс?
Есть ли другой хороший способ определения часового пояса системы?
UPDATE.
Я только что обнаружил, что POSIX правильно определяет часовой пояс. Итак, проблема с датой :: Manip
use POSIX;
print strftime("%Z", localtime()), "\n";