我如何parsingdate和在Perl中转换时区?

我在Perl中使用localtime函数来获取当前的date和时间,但需要parsing现有的date。 我有以下格式的GMTdate:“20090103 12:00”我想parsing它到我可以使用的date对象,然后将GMT时间/date转换为我当前的时区,这是目前东部标准时间。 所以我想转换“20090103 12:00”到“20090103 7:00”关于如何做到这一点的任何信息将不胜感激。

因为在date处理接口中内置的Perl是一种笨重的,你绕了半打variables,更好的方法是使用DateTime或Time :: Piece 。 DateTime是所有歌曲,全部跳舞的Perldate对象,并且您可能最终想要使用它,但是Time :: Piece更简单且完全适合于此任务,具有5.10版本的优势,技术是两者基本相同。

这是使用Time :: Piece和Strptime的简单而灵活的方法。

#!/usr/bin/perl use 5.10.0; use strict; use warnings; use Time::Piece; # Read the date from the command line. my $date = shift; # Parse the date using strptime(), which uses strftime() formats. my $time = Time::Piece->strptime($date, "%Y%m%d %H:%M"); # Here it is, parsed but still in GMT. say $time->datetime; # Create a localtime object for the same timestamp. $time = localtime($time->epoch); # And here it is localized. say $time->datetime; 

这就是对比的方式。

由于格式是固定的,一个正则expression式可以做得很好,但是如果格式改变,你必须调整正则expression式。

 my($year, $mon, $day, $hour, $min) = $date =~ /^(\d{4}) (\d{2}) (\d{2})\ (\d{2}):(\d{2})$/x; 

然后将其转换为Unix纪元时间(1970年1月1日以来的秒数)

 use Time::Local; # Note that all the internal Perl date handling functions take month # from 0 and the year starting at 1900. Blame C (or blame Larry for # parroting C). my $time = timegm(0, $min, $hour, $day, $mon - 1, $year - 1900); 

然后回到当地时间

 (undef, $min, $hour, $day, $mon, $year) = localtime($time); my $local_date = sprintf "%d%02d%02d %02d:%02d\n", $year + 1900, $mon + 1, $day, $hour, $min; 

下面是一个例子,使用DateTime和它的strptime格式模块。

 use DateTime; use DateTime::Format::Strptime; my $val = "20090103 12:00"; my $format = new DateTime::Format::Strptime( pattern => '%Y%m%d %H:%M', time_zone => 'GMT', ); my $date = $format->parse_datetime($val); print $date->strftime("%Y%m%d %H:%M %Z")."\n"; $date->set_time_zone("America/New_York"); # or "local" print $date->strftime("%Y%m%d %H:%M %Z")."\n"; $ perl dates.pl 20090103 12:00 UTC 20090103 07:00 EST 

如果你想parsing当地时间,这是你怎么做:)

 use DateTime; my @time = (localtime); my $date = DateTime->new(year => $time[5]+1900, month => $time[4]+1, day => $time[3], hour => $time[2], minute => $time[1], second => $time[0], time_zone => "America/New_York"); print $date->strftime("%F %r %Z")."\n"; $date->set_time_zone("Europe/Prague"); print $date->strftime("%F %r %Z")."\n"; 

那就是我要做的

 #!/usr/bin/perl use Date::Parse; use POSIX; $orig = "20090103 12:00"; print strftime("%Y%m%d %R", localtime(str2time($orig, 'GMT'))); 

您也可以使用Time::ParseDateparsedate()而不是Date::Parsestr2time() 。 请注意,事实上的标准atm。 似乎是DateTime(但您可能不想使用OO语法来转换时间戳)。

拿你的select:

  • DateTime :: *(或者在datetime.perl.org )
  • date:: MANIP
  • Date :: Calc (2004年最新更新)

毫无疑问,还有其他数十万人,但他们可能是最有力的竞争者。

 use strict; use warnings; my ($sec,$min,$hour,$day,$month,$year)=localtime(); $year+=1900; $month+=1; $today_time = sprintf("%02d-%02d-%04d %02d:%02d:%02d",$day,$month,$year,$hour,$min,$sec); print $today_time;