用于将记录的日期时间转换为UNIX纪元时间戳的Perl脚本

时间:2013-04-03 20:27:34

标签: perl grep timestamp epoch

我有一个日志文件(datetimes.log),包含数十万个表单的时间戳:

YYYY-MM-DD HH:mm:ss

例如:

2013-03-28 06:43:51
2013-03-28 06:43:55
2013-03-28 06:44:03
...etc.

我想编写一个简单的Perl脚本来输出包含相同条目的新unix_timestamps.log文件,而不是日期时间,以获得相应的UNIX纪元时间戳。对于上面的示例,unix_timestamps.log文件中将包含以下信息:

1364453031
1364453035
1364453043
...etc.

我唯一能想到的是perl convert_2_timestamps.pl

#!/usr/bin/perl

use warnings;
use strict;

grep m/_(\d{4})(\d\d)(\d\d)/ | POSIX::mktime(?, ?, ?, ?, ?, ?) > unix_timestamps.log

但不确定如何将参数传输到mktime,并且不确定这是否是正确的方法。提前谢谢。

4 个答案:

答案 0 :(得分:4)

use strict;
use warnings;
use DateTime::Format::Strptime;


my $parser = DateTime::Format::Strptime->new(
  pattern => '%Y-%m-%d %H:%M:%S',
  on_error => 'croak',
);

while( <DATA> ) {
   my $dt = $parser->parse_datetime($_);
   print $dt->epoch, "\n";
}

__DATA__
2013-03-28 06:43:51
2013-03-28 06:43:55
2013-03-28 06:44:03

答案 1 :(得分:2)

这是Time::Piece模块的完美用法,它已成为Perl发行版的标准组成部分超过五年。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Time::Piece;

# Read the data a record at a time. Data ends up in $_.
# N.B. Using built-in DATA filehandle for this demo.
#      In the real world you'd open a separate filehandle.
while (<DATA>) {
  chomp;
  # Create a Time::Piece object using strptime (that's "string
  # parse time") and immediately call the epoch method on the
  # new object to get the value you want.
  say Time::Piece->strptime($_, '%Y-%m-%d %H:%M:%S')->epoch;
}

__DATA__
2013-03-28 06:43:51
2013-03-28 06:43:55
2013-03-28 06:44:03

答案 2 :(得分:0)

尝试使用Date::Parse CPAN模块。 (http://metacpan.org/pod/Date::Parse

有了它,您的convert_2_timestamps.pl就可以了:

#!/usr/bin/perl

use warnings;
use strict;

use Date::Parse;

while (<>) {
  chomp;
  printf("%s\n", str2time("$_ GMT"));
}

请注意,我必须将GMT附加到您的示例输入中以获得预期的输出。

运行方式:

perl convert_2_timestamps.pl < datetimes.log > unix_timestamps.log

答案 3 :(得分:0)

你可以这样分解YYYY-MM-DD HH:mm:ss格式:

my ( $y, $m, @t ) = split /[-: ]+/, $time_str;
my $time = mktime( reverse @t, $m - 1, $y - 1900 );

但你也可以把它放在替换中:

s{(\d{4})-(0?[1-9]\d?)-(0?[1-9]\d?) (0?\d{1,2}):(0?\d{1,2}):(0?\d{1,2})}{
    mktime( $6, $5, $4, $3, $2 - 1, $1 - 1900 )
 }e;