【问题标题】:How to convert unknown date/time format into normal using Perl? [duplicate]如何使用 Perl 将未知日期/时间格式转换为正常格式? [复制]
【发布时间】:2015-07-10 10:13:59
【问题描述】:

我有这样的日期/时间: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 行解析时间出错

感谢任何帮助。

【问题讨论】:

标签: perl datetime format iso8601 strptime


【解决方案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 无论如何都不会做 ms 分辨率)

如果您愿意,您可以使用正则表达式来“更正”您输入的日期。我不确定是否适合您的用例,但是:

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

【讨论】:

    【解决方案2】:

    您可以在Time::Piece 中使用strptime 并手动添加时区,如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
    

    【讨论】:

    • 那么%N 在那个里面工作吗?
    【解决方案3】:
    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";
    

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 2014-06-10
      • 2018-05-05
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2016-07-04
      • 2014-01-23
      相关资源
      最近更新 更多