2013-11-15 7 views
4

Я пытаюсь работать с датой строк, отформатированные как:Perl формат strptime отличается от STRFTIME

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.

В человеке сказал %F является ISO8601 формат даты в strptime и STRFTIME обоих. Является ли strptime обратной совместимостью с strftime?

+0

Все перечисленное работает для меня на Perl 5.10.1 на Scientific Linux 6.4. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot, вам повезло :) – Suic

ответ

6

Модуль использует свою собственную реализацию strptime, который не понимает %F. Он не выполняет свои собственные strftime. Это катастрофа, ожидающая случиться - вы обязательно должны использовать strftime и strptime, которые поступают из того же источника. Time::Piece::strptime выглядит как ошеломительный переход от эпохи без широко доступного, стандартизированного strptime.

Теперь, когда strptime в POSIX, я бы ожидал POSIX.pm, чтобы экспортировать его, поэтому вы можете использовать strptime вашей системы. Но, по-видимому, этот модуль также не в состоянии идти в ногу. Существует отдельный POSIX::strptime module, который дает вам вашу библиотеку C strptime без помех. Я предлагаю использовать это.

+0

Обратите внимание: Cygwin использует NewLib для своей библиотеки C, которая не имеет strptime. – kevinarpe

5

No, Time :: Piece 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"; 
Смежные вопросы