/ / perl date fetchスクリプト支援 - perl

perlの日付取り出しスクリプトの助け - perl

私はperlを試していました。で始まるテキストファイルの行から日付と時刻を抽出しようとしていました

日付:2017年02月05日21:30:00 PST - 2017年2月6日06:00:00 PST

私はスクリプトを掃除することに成功しましたが、Imはそれを修正しようとしています。

start date - 2017-02-05 21:30:00
end date   - 2017-02-06 06:00:00

どんな助けもありがとう

 #Is it a reg date
} elsif (!$start && $line[$i] =~ /^Date: (.+?) - (.+)$/i) {
$regstartdate = $1;
$regenddate = $2;

} elsif (!$start && $line[$i] =~ /^Date: (.+)$/i) {
#Monday 3rd July 2006
#Friday 30th June 2006 01:00 Hrs EST
$regstartdate = $1;

eval{
$start = &dateconv($regstartdate);
$end = $start;
1;
}
or do{
warn "Could not process start date: $regstartdate";
};
} elsif (!$start && $line[$i] =~ /^Time:s*(d+:d+)[s-]+s+(d+:d+)s+[hH][rR][sS]s+(w+)$/i) {
$tz = $3;
$twestartdate = $regstartdate . " ".$1." Hrs ".$3;
$tweenddate = $regenddate . " ".$2." Hrs ".$3;
$start = &dateconv($regstartdate);
$end = &dateconv($regenddate);

} elsif (!$start && $line[$i] =~ /^Time:s*(d+:d+)[s*-]+s*(d+:d+)s+(w+)$/i) {
$tz = $3;
$regstartdate = $regstartdate . " ".$1." Hrs ".$3;
$regenddate = $regenddate . " ".$2." Hrs ".$3;
$start = &dateconv($regstartdate);
$end = &dateconv($regenddate);

#Is it a reg Time
} elsif (!$start && $line[$i] =~ /^Interruption Time: (d+:d+)[s-]+(d+:d+) (w+)/i) {
$regstartdate = $regstartdate . " " . $1 . " Hrs " . $3;
$regenddate = $regenddate . " " . $2 . " Hrs " . $3;


$start = &dateconv($regstartdate);
$end = &dateconv($regenddate);

#Is is the start time ?
} elsif (!$start && $line[$i] =~ /^Duration:s*START DATE (.*)/i) {
$start = &dateconv($1);

#Is it the end time ?
} elsif (!$end && $line[$i] =~ /^END DATE (.*)/i) {
my $endtime = $1;
$end = &dateconv($endtime);
$endtime =~ m/(w{1,2}ST)/g;
$tz = $1;

回答:

回答№1は2

を使用してソリューションを提供する Time::Piece 私はどちらが好きですか - 両方とも私はインターフェースが好きだからですが、それはまたperl 5.9.5の時点でコアなので

#!/usr/bin/env perl
use strict;
use warnings;

use Time::Piece;

my $input_format  = "%d/%b/%Y %H:%M:%S";
my $output_format = "%Y-%m-%d %H:%M:%S";

while (<DATA>) {
if ( my ( $start_str, $end_str ) = m/Date: (.*) PST - (.*) PST/ ) {
my $start = Time::Piece->strptime( $start_str, $input_format );
my $end   = Time::Piece->strptime( $end_str,   $input_format );

print "Start:t", $start->strftime($output_format), "n";
print "End:  t", $end  ->strftime($output_format), "n";
}
}


__DATA__
Date: 05/Feb/2017 21:30:00 PST - 06/Feb/2017 06:00:00 PST

私が好きな理由は $start そして $end 上記は「時間オブジェクト」なので、次のようなことができます。

print $start -> epoch;
print "Elapsed time: ", $end - $start, "sn";

回答№2の場合は0

あなたが 日付時刻 モジュール、これらの日付文字列の解析とフォーマットは簡単です。

use strict;
use warnings;
use 5.010;

use DateTime;
use DateTime::Format::Strptime;

my $fmt = DateTime::Format::Strptime->new(pattern => "%d/%b/%Y %H:%M:%S");

my $line = "Date: 05/Feb/2017 21:30:00 PST - 06/Feb/2017 06:00:00 PST";
$line =~ s/^Date: //;
my @dates = split(/s*-s*/, $line);

for my $date (@dates) {
my $dt = $fmt->parse_datetime($date);
say $dt->ymd . " " . $dt->hms;
}

プロデュース:

2017-02-05 21:30:00
2017-02-06 06:00:00

あなたが合うようにあなたはフォーマットを調整することができます。