Perl的DateTime :: Format :: Strptime中的方法parse_datetime无法解析时区名称

时间:2014-05-08 08:30:30

标签: linux ubuntu strptime

我的笔记本电脑配有ubuntu 12.04。 在控制台上执行date命令会导致:

$ date
Thu May  8 15:28:12 WIB 2014

下面的perl脚本运行良好。

#!/usr/bin/perl

use DateTime::Format::Strptime;

$parser = DateTime::Format::Strptime->new( pattern => "%a %b %d %H:%M:%S %Y %Z");

$date = "Fri Sep 20 08:22:42 2013 WIB";
$dateimap = $parser->parse_datetime($date);
$date = $dateimap->strftime("%d-%b-%Y %H:%M:%S %z");
print "$date\n";

$date = "Fri Jan  8 16:49:34 2010 WIT";
$dateimap = $parser->parse_datetime($date);
$date = $dateimap->strftime("%d-%b-%Y %H:%M:%S %z");
print "$date\n";

结果是

20-Sep-2013 08:22:42 +0700
08-Jan-2010 16:49:34 +0900

但是,为什么时区名称“WIT”被转换为时区“+0900”? AFAIK,WIT是西印度尼西亚时间。恕我直言,它应该有时区“+0700”而不是“+0900”。

另一台电脑有一台正在运行的CentOS 5.9。

在CentOS结果执行date命令:

$ date
Thu May  8 15:38:24 WIT 2014

但是上面的perl脚本的执行结果如下:

20-Sep-2013 08:22:42 +0700
Can't call method "strftime" on an undefined value at strptime.pl line 14.

实际上方法parse_datetime无法解析包含“WIT”时区的日期。 返回值$ dateimap为空或undef。

CentOS已定于亚洲/雅加达当地时间。

$ ls -l /etc/localtime 
lrwxrwxrwx 1 root root 32 Sep 23  2013 /etc/localtime -> /usr/share/zoneinfo/Asia/Jakarta

有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

实际上问题发生是因为CentOS 5.9的模块DateTime :: Format :: Strptime的版本是1.2000,而ubuntu 12.04的版本是1.54。

使用旧版DateTime :: Format :: Strptime的另一个问题。

$ perl -e '
> use DateTime::Format::Strptime;
> $parser   = DateTime::Format::Strptime->new( pattern => "%a %b %d %H:%M:%S %Y");
> $datembox = "Wed Jan  1 06:42:18 2014 WIT";
> $date = $parser->parse_datetime($datembox);
> print "$date\n";'

$ 

如果我们在变量$ datembox中删除双空格。

$ perl -e '
> use DateTime::Format::Strptime;
> $parser   = DateTime::Format::Strptime->new( pattern => "%a %b %d %H:%M:%S %Y");
> $datembox = "Wed Jan  1 06:42:18 2014 WIT";
> $datembox =~ s/[\s]+/ /g;
> $date = $parser->parse_datetime($datembox);
> print "$date\n";'
2014-01-01T06:42:18
$