如何使用Time :: Piece strptime解析微秒?

时间:2010-10-25 05:38:42

标签: perl

我的时间戳看起来像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 个答案:

答案 0 :(得分:12)

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");

答案 1 :(得分:5)

strptime不会读到这一点。 strptime使用的结构只能下降到整数秒,并且它没有任何格式来识别非整数数字 - 并且N中没有Time::Piece这样的格式是strptime。如果您知道自己总是希望.000000持续数微秒,那么您可以尝试使用..."%I.%M.%S.000000 %p",否则strptime不适合您。

DateTime::Format::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

编辑:只是注意到,如果它们都是大写的,则无法正确识别月份 - 它会识别“十月”而不是“OCT”。固定版本可用here并已发送到上游进行合并:)

更新: DateTime :: Format :: CLDR 1.11正确区分大小写。