全部
我要解析具有以下格式的日志文件:
2019-09-06T16:06:36+00:00 some_text
现在我很好奇的是如何处理+
符号后的数字。
我可以用“”字符分隔行以获取时间戳,然后用T
分隔时间戳,但是Perl中的日期/时间函数会理解16:06:36+00:00
时间吗?我需要将其传递到timelocal()
才能获得新纪元。
TIA!
答案 0 :(得分:5)
冒号是多余的,并且妨碍了您的解析。一段时间以前,Python Bug跟踪器中已有关于使用冒号解析时区偏移的讨论,但从未真正解决过。最简单的解决方案是摆脱它:
use Time::Piece; # A core Perl module.
my $entry = '2019-09-06T16:06:36+00:00 some_text';
my ($timestamp, $text) = split(/\s+/, $entry, 2);
$timestamp =~ s/:(\d+)$/$1/;
my $t = Time::Piece->strptime($timestamp, "%Y-%m-%dT%T%z");
在此示例中,我们分割了第一个空格以隔离日期戳,然后替换掉最后一个冒号。因此$timestamp
现在将包含:
2019-09-06T16:06:36+0000
...这是strptime
可以理解的时间戳,只要有适当的格式字符串。
答案 1 :(得分:2)
您拥有的是RFC3339时间戳。因此,您可以使用DateTime::Format::RFC3339。
use DateTime::Format::RFC3339 qw( );
my ($dt_str) = split ' ', '2019-09-06T16:06:36+00:00 some text';
my $format = DateTime::Format::RFC3339->new;
my $dt = $format->parse_datetime($dt_str);
my $epoch = $dt->epoch;
您拥有的是ISO8601时间戳。因此,您可以使用DateTime::Format::ISO8601。
use DateTime::Format::ISO8601 qw( );
my ($dt_str) = split ' ', '2019-09-06T16:06:36+00:00 some text';
my $format = DateTime::Format::ISO8601->new;
my $dt = $format->parse_datetime($dt_str);
my $epoch = $dt->epoch;
答案 2 :(得分:1)
Time::Moment的from_string构造函数可以识别此ISO8601格式,即使冒号也存在。
use strict;
use warnings;
use Time::Moment;
my $line = '2019-09-06T16:06:36+00:00 some_text';
my ($ts, $rest) = split ' ', $line, 2; # single space is a special case for split()
my $moment = Time::Moment->from_string($ts);
my $epoch = $moment->epoch;
如果要混合使用格式(例如,偏移量中的冒号而不是时间),则可能需要选项lenient => 1
。