Perl strptime格式与strftime不同

时间:2013-11-15 15:00:03

标签: perl strftime strptime

我正在尝试使用格式为:

的日期字符串
  

YYYY-MM-DDTHH:MM:SS

用于生成此字符串的strftime格式为%FT%T

perl -MPOSIX=strftime -E 'say strftime q{%FT%T}, localtime;'

但是当我尝试用Time::Piece解析这个日期字符串时:

perl -MPOSIX=strftime -MTime::Piece -E '
  say strftime q{%FT%T}, localtime;
  Time::Piece->strptime( strftime(q{%FT%T}, localtime), q{%FT%T});
'

我收到了这个错误:

2013-11-15T17:32:58
Error parsing time at /usr/local/lib/perl/5.14.2/Time/Piece.pm line 469.

或者如果我试试这个:

perl -MPOSIX=strftime -MTime::Piece -E 'Time::Piece->strptime(strftime(q{%F}, localtime), q{%F});'

我明白了:

garbage at end of string in strptime: 2013-11-15 at /usr/local/lib/perl/5.14.2/Time/Piece.pm line 469.

在man中说%F是strptime和strftime中的ISO8601日期格式。 strptime向后兼容strftime吗?

2 个答案:

答案 0 :(得分:6)

该模块使用自己的strptime实现,但不理解%F。它没有实现自己的strftime。这是一场等待发生的灾难 - 您绝对应该使用来自同一来源的strftimestrptimeTime::Piece::strptime看起来像是一个没有广泛可用的标准化strptime的时代的移民。

既然strptime在POSIX中,我希望POSIX.pm能够导出它,以便您可以使用系统的strptime。但显然该模块也未能跟上。有一个单独的POSIX::strptime module,它可以为您的C库strptime提供无干扰。我建议使用它。

答案 1 :(得分:5)

不,时间::片段strftime / strptime格式并不总是兼容。使用较长版本的格式:

my $str = '2003-03-24T13:32:44';
my $f = '%Y-%m-%dT%H:%M:%S';
my $t = Time::Piece->strptime($str, $f);

print "$t\n";