时间戳格式

时间:2019-09-09 18:30:28

标签: perl timestamp

全部

我要解析具有以下格式的日志文件:

2019-09-06T16:06:36+00:00 some_text

现在我很好奇的是如何处理+符号后的数字。 我可以用“”字符分隔行以获取时间戳,然后用T分隔时间戳,但是Perl中的日期/时间函数会理解16:06:36+00:00时间吗?我需要将其传递到timelocal()才能获得新纪元。

TIA!

3 个答案:

答案 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