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



我有一个这样的日期/时间: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/piecePM第470行

任何帮助都是感激的。

我认为有几个问题。

%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做ms分辨率)

如果你愿意的话,你可以使用一个正则表达式来"纠正"你输入的日期。我不确定是否适合您的用例,但是:

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

您可以在Time::Piece中使用strptime并手动添加时区,如此答案所示,或者您可以尝试使用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
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 "$daten";

相关内容

  • 没有找到相关文章

最新更新