我的时间戳看起来像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
。他们似乎没有工作。有人能告诉我我做错了吗?
答案 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正确区分大小写。