我的笔记本电脑配有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
有什么建议吗?
谢谢。
答案 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
$