You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl脚本转换指定站点时区时间后,可读格式输出异常的解决请求

Perl时区转换问题:localtime显示本地时区而非目标时区的解决方法

你的问题核心在于:Unix时间戳本身是UTC时区无关的,localtime()函数会自动将其转换为脚本运行环境的本地时区(也就是伦敦时区),所以即使你得到了正确的对应班加罗尔时间的时间戳,用localtime输出还是会显示伦敦时间。

要输出目标时区(Asia/Kolkata)的可读格式,有两种简单的解决方式:


方法1:利用DateTime模块直接格式化输出

既然已经在convertSiteSpecificTime里创建了DateTime对象,直接用它的格式化方法生成目标时区的可读字符串即可,不需要先转成epoch再反向处理。

修改后的脚本:

#!/usr/bin/perl
use strict;
use warnings;
use Date::Parse;
use DateTime;
use Date::Format;
use Time::Local;

my $id = "BAN";

my %time_zone_hash = (
        'LON' => 'Europe/London',
        'BAN' => 'Asia/Kolkata',
);

# 改为返回DateTime对象而非epoch
my $dt = convertSiteSpecificTime($id, "2023-05-15 04:30:00");
print "time:" . $dt->epoch() . "\n";

# 用DateTime的strftime方法生成目标时区的可读格式
print "time in readable format:" . $dt->strftime("%a %b %d %H:%M:%S %Y") . "\n";

sub convertSiteSpecificTime {
        my $id = shift;
        my $time_str = shift;
        my $epoch_time = str2time(time2str("%Y-%m-%d %T", str2time($time_str)));

        if (!$epoch_time) {
                print "'$time_str' is not a valid date. Please provide a valid date.\n";
                exit(1);
        }
        my $dt = DateTime->from_epoch(epoch => $epoch_time);
        $dt->set_time_zone($time_zone_hash{$id});

        print "dt: $dt\n";
        return $dt; # 返回DateTime对象
}

方法2:用Date::Format的time2str指定时区

如果你还是想保留返回epoch的逻辑,可以用Date::Format模块的time2str函数,通过临时切换时区来输出目标格式:

修改后的输出部分代码:

my $bang_time = convertSiteSpecificTime($id, "2023-05-15 04:30:00");
print "time:$bang_time\n";

# 临时设置时区为目标时区,输出后恢复原时区
my $old_tz = $ENV{TZ};
$ENV{TZ} = $time_zone_hash{$id};
print "time in readable format:" . time2str("%a %b %d %H:%M:%S %Y", $bang_time) . "\n";
$ENV{TZ} = $old_tz; # 恢复原时区

两种方法运行后都会得到你期望的结果:

dt: 2023-05-15T09:00:00
time:1684121400
time in readable format:Mon May 15 09:00:00 2023

内容的提问来源于stack exchange,提问作者vkk05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:35:21