1

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

4 に答える 4

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
于 2013-04-03T20:39:23.567 に答える
2

これは、5 年以上にわたって Perl ディストリビューションの標準部分であったTime::Pieceモジュールの完全な使用方法です。

#!/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
于 2013-04-04T09:51:43.053 に答える
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;
于 2013-04-03T21:03:10.083 に答える
0

Date::ParseCPAN モジュールを試してください。( 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
于 2013-04-03T20:29:48.213 に答える