如何使用Perl将未知日期/时间格式转换为正常?

时间:2015-07-10 10:14:00

标签: perl datetime format iso8601 strptime

我的日期/时间如下:2015-07-31T13:30:00.000 + 01:00 我想使用Perl和Time :: Piece-> strptime

将其转换为正常的日期和时间

这是我的代码:

sub changeDateFormat {
  my ($date, $fromFormat, $toFormat) = (@_);
  return Time::Piece->strptime($date, $fromFormat)->strftime($toFormat);
}

电话:

print changeDateFormat($that_date, '%Y-%m-%dT%H:%M:%S.%N+%z', '%Y:%m:%d');

我认为.000是纳秒秒而+01.00代表时区。 但是给定的代码给出了: 在/usr/lib64/perl5/Time/Piece.pm第470行解析时间时出错

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我认为有几个问题。

%N不在我的strftime联机帮助页中。所以这可能行不通。

%z - 我非常确定+01:00无效。

  %z     The +hhmm or -hhmm numeric timezone (that is, the hour and
          minute offset from UTC). (SU)

但这有效:

my $date = '2015-07-31T13:30:00+0100'; 
my $fromFormat = '%Y-%m-%dT%H:%M:%S%z'; 
print Time::Piece->strptime($date, $fromFormat);

所以我建议 - 除非你的毫秒很重要 - 你可以通过正则表达式剥离它们,同样时间区域。 (而且它们很重要,我认为无论如何Time::Piece无法解决问题。

您可以使用正则表达式来纠正'如果你这么倾向,你的输入日期。我不确定是否适合您的用例,但是:

$date =~ s/\+(\d{2}):(\d{2})$/+$1$2/;
$date =~ s/\.\d{3}+/+/;

答案 1 :(得分:1)

您可以strptime使用Time::Piece并手动添加时区,如this answer所示,或者您可以尝试使用DateTime::Format::Strptime代替:

use feature qw(say);
use strict;
use warnings;
use DateTime::Format::Strptime;

my $timestamp = '2015-07-31T13:30:00.000+0100';
my $strp = DateTime::Format::Strptime->new(
    pattern   => '%Y-%m-%dT%H:%M:%S.%N%z'
);

my $dt = $strp->parse_datetime( $timestamp );

say $dt->strftime('%Y:%m:%d');

输出:

2015:07:31

答案 2 :(得分:1)

use DateTime; 
use DateTime::Format::ISO8601;

use DateTime::Format::Strptime;

my $string = '2015-07-31T13:30:00.000+01:00';
my $date = DateTime::Format::ISO8601->parse_datetime( $string ); 
die "Error" unless $date;

my $formatter = new DateTime::Format::Strptime(pattern => '%Y-%m-%d %T');
$date->set_formatter($formatter);
print "$date\n";