我曾以为只需使用$ENV{TZ}
就能轻松解决问题,但是TZ
环境变量未设置,然而date
命令仍然知道我在东部夏令时区,因此必须有其他方法确定时区(除了使用chomp(my $tz = qx/date +%Z/);
的方式)。
我曾以为只需使用$ENV{TZ}
就能轻松解决问题,但是TZ
环境变量未设置,然而date
命令仍然知道我在东部夏令时区,因此必须有其他方法确定时区(除了使用chomp(my $tz = qx/date +%Z/);
的方式)。
use POSIX;
print strftime("%Z", localtime()), "\n";
use POSIX qw(strftime);
这样可以节省约 5 毫秒并减少加载其他常量时名称冲突的风险。 - 700 SoftwarePOSIX
更加便携的解决方案(尽管可能会慢一些),您可以使用DateTime::TimeZone来实现此功能:use DateTime::TimeZone;
print DateTime::TimeZone->new( name => 'local' )->name();
use POSIX;
localtime();
my ($std, $dst) = POSIX::tzname();
tzname()
提供了访问POSIX全局变量tzname
的方法,但是在第一次使用之前,您需要调用localtime()
来设置它。
+05:30
(UTC+5.5/印度时间)这样的东西,你可以使用以下代码。my @lt = localtime();
my @gt = gmtime();
my $hour_diff = $lt[2] - $gt[2];
my $min_diff = $lt[1] - $gt[1];
my $total_diff = $hour_diff * 60 + $min_diff;
my $hour = int($total_diff / 60);
my $min = abs($total_diff - $hour * 60);
print sprintf("%+03d:%02d", $hour, $min);
或许这样更快:
my @lt = localtime(12*60*60);
my @gt = gmtime(12*60*60);
$tz = @lt[2] - @gt[2];
$tz_ = sprintf("%+03d:00", $tz); # for +02:00 format
my $hour_seconds = 60 * 60;
my $day_seconds = 24 * $hour_seconds;
#what is today's time at 00:00
my $right_now = time();
my $days = $right_now / $day_seconds;
my $years = $right_now / ($day_seconds * 365);
my $days_rounded = sprintf("%d", $days);
my $today_seconds_at_midnight = $days_rounded * $day_seconds;
my @lt = localtime($today_seconds_at_midnight + ($day_seconds / 2)); #must use noon today or we will get odd values
my $tz = $lt[2] - 12; #calc timezome difference, includes DST