perl日期获取脚本帮助

perl日期获取脚本帮助,perl,Perl,我只是想试试perl。我试图从文本文件中以开头的一行中提取日期和时间 日期:2017年2月5日太平洋标准时间21:30:00-2017年2月6日太平洋标准时间06:00:00 我已经设法清除了一个脚本,但我试图修改它,使其提取上述内容 start date - 2017-02-05 21:30:00 end date - 2017-02-06 06:00:00 任何帮助都将不胜感激 #Is it a reg date } elsif (!$start && $li

我只是想试试perl。我试图从文本文件中以开头的一行中提取日期和时间

日期:2017年2月5日太平洋标准时间21:30:00-2017年2月6日太平洋标准时间06:00:00

我已经设法清除了一个脚本,但我试图修改它,使其提取上述内容

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;
如果使用该模块,则解析和格式化这些日期字符串非常简单:

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
您可以根据需要调整格式。

如果您使用该模块,解析和格式化这些日期字符串非常简单:

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

您可以根据需要调整格式。

提供了一个使用
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

提供一个使用
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

我想我现在把剧本弄坏了?@perln00b我不知道。是吗?我倾向于使用
Time::Piece
,因为它是5.9.5版的核心。但是它的功能类似于
my$t=Time::Piece->strtime($Time\u str,$format)
@Sobrique我喜欢它的核心,但糟糕的时区处理和缺乏操作功能使它不值得我这么麻烦。时区是公平的-解析
PST
需要一点时间。你所说的操纵功能是什么意思?我想我现在破坏了脚本?@perln00b我不知道。是吗?我倾向于使用
Time::Piece
,因为它是5.9.5版的核心。但是它的功能类似于
my$t=Time::Piece->strtime($Time\u str,$format)
@Sobrique我喜欢它的核心,但糟糕的时区处理和缺乏操作功能使它不值得我这么麻烦。时区是公平的-解析
PST
需要一点时间。你所说的操纵功能是什么意思?