全,
我将解析日志文件,它的格式如下:
2019-09-06T16:06:36+00:00 some_text现在我想知道的是如何处理+符号之后的数字。我可以用“”字符拆分行来获得时间戳,然后用T拆分时间戳,但是Perl中的日期/时间函数能理解16:06:36+00:00时间吗?我需要将它传递给timelocal()以获取一个纪元时间。
蒂娅!
发布于 2019-09-10 03:27:42
冒号是多余的,并且会阻碍您的解析。不久前在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...and,它是strptime可以理解的时间戳,给定适当的格式字符串。
发布于 2019-09-10 05:24:07
您所拥有的是一个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;发布于 2019-09-10 03:46:48
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。
https://stackoverflow.com/questions/57859440
复制相似问题