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
相关产品推荐
相关产品推荐

