Как я могу разобрать микросекунды с Time :: Piece strptime? - PullRequest
3 голосов
/ 25 октября 2010

У меня есть отметка времени, которая выглядит как 25-OCT-10 04.11.00.000000 AM.Я пытаюсь преобразовать это в формат времени с

Time::Piece->strptime("25-OCT-10 04.11.00.000000 AM","%d-%b-%y %I.%M.%S.%6N %p")

, но он продолжает выдавать ошибки.Я пробовал %OS, %SZ.Кажется, они не работают.Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

12 голосов
/ 25 октября 2010

Time :: Piece не поддерживает доли секунды. Попробуйте вместо этого DateTime , например, DateTime :: Format :: Strptime :

use DateTime::Format::Strptime;

my $parser = DateTime::Format::Strptime->new(
  pattern => '%d-%b-%y %I.%M.%S.%6N %p',
);

my $dt = $parser->parse_datetime("25-OCT-10 04.11.00.000000 AM");
5 голосов
/ 25 октября 2010

strptime не прочитает это.strptime работает со структурой, которая сводится только к целочисленным секундам, и не имеет никаких форматов для распознавания нецелых чисел - и нет такого формата, как N в Time::Piece '* strptime.Если вы знаете, что вы всегда ожидаете .000000 в течение нескольких микросекунд, то вы можете попробовать использовать ..."%I.%M.%S.000000 %p", иначе strptime просто не для вас.

Как насчет DateTime:: Формат :: CLDR ?Формат "dd-MMM-yy hh.mm.ss.SSSSSS a", кажется, прекрасно работает с этим форматом.

use DateTime::Format::CLDR;
my $parser = DateTime::Format::CLDR->new(
    pattern => "dd-MMM-yy hh.mm.ss.SSSSSS a",
    locale => "en_US",
);
my $dt = $parser->parse_datetime("25-OCT-10 04.11.00.000100 AM");

say $dt->iso8601; # 2010-01-25T04:11:00

Редактировать: только что заметил, что месяцы не распознаются должным образом, если все они прописные -он распознает «октябрь», но не «октябрь».Исправленная версия доступна здесь и была отправлена ​​в восходящем направлении для слияния:)

Обновление: DateTime :: Format :: CLDR 1.11 корректно без учета регистра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...