如何在Perl中更改日期时间值的时区?

问题描述:

使用此功能:如何在Perl中更改日期时间值的时区?

perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";' 

它会返回一个epochtime - 但只有在格​​林尼治标准时间 - 如果我想要的结果在GMT + 1(这是系统的本地时间(TZ)),我需要做什么改变?

由于提前,

安德斯

+0

检查这些: [http://www.bestofperl.com/how -tos/timezone-conversion-date-time](http://www.bestofperl.com/how-tos/timezone-conversion-date-time)[http:// w (http://www.bestofperl.com/how-tos/parsing-datetime-strings) – Pradeep 2011-12-08 05:19:25

只有一个基于UTC的epochtime的标准定义,而不是不同时区的不同epochtimes。

如果你想找到offset between gmtime and localtime,使用

use Time::Local; 
@t = localtime(time); 
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t); 

你只需要设置时区。尝试:

 
env TZ=UTC+1 perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";' 
+2

TLA时区不明确,定义不清。最好使用[zoneinfo](http://en.wikipedia.org/wiki/Olson_database)名称:'TZ = Europe/Berlin perl ...' – daxim 2010-02-01 14:18:25

+1

以下是直接链接到[有效时区列表字符串](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)aka'Zone.tab'。 – 2017-01-09 12:55:08

Time::Local::timelocallocaltime倒数。其结果将是在主机的本地时间:

$ perl -MTime::Local -le \ 
    'print scalar localtime timelocal "00","00","00","01","01","2000"' 
Tue Feb 1 00:00:00 2000

你想对应于该localtimegmtime

$ perl -MTime::Local' -le \ 
    'print scalar gmtime timelocal "00","00","00","01","01","2000"' 
Mon Jan 31 23:00:00 2000

你想它周围的其他方式,对应于该gmtimelocaltime

$ perl -MTime::Local -le \ 
    'print scalar localtime timegm "00","00","00","01","01","2000"' 
Tue Feb 1 01:00:00 2000
+0

投票,很好的信息。谢谢。 – Anders 2010-02-01 15:16:34

虽然Time :: Local是一个合理的解决方案,但您最好使用更现代的DateTime面向对象模块。以下是一个示例:

use strict; 
use DateTime; 
my $dt = DateTime->now; 
print $dt->epoch, "\n"; 

对于时区,可以使用DateTime :: TimeZone模块。

use strict; 
use DateTime; 
use DateTime::TimeZone; 

my $dt = DateTime->now; 
my $tz = DateTime::TimeZone->new(name => "local"); 

$dt->add(seconds => $tz->offset_for_datetime($dt)); 

print $dt->epoch, "\n"; 

CPAN链接:

DateTime

use DateTime; 
my $dt = DateTime->now; 
$dt->set_time_zone('Europe/Madrid'); 

的其他例子基于DateTime::Format::Strptime

use strict; 
use warnings; 
use v5.10; 
use DateTime::Format::Strptime; 

my $s = "2016-12-22T06:16:29.798Z"; 
my $p = DateTime::Format::Strptime->new(
    pattern => "%Y-%m-%dT%T.%NZ", 
    time_zone => "UTC" 
); 

my $dt = $p->parse_datetime($s);  
$dt->set_time_zone("Europe/Berlin"); 
say join ' ', $dt->ymd, $dt->hms; # shows 2016-12-22 07:16:29