Как преобразовать неизвестный формат даты / времени в нормальный с помощью 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 - часовой пояс. Но данный код дает следующее: Ошибка синтаксического анализа в строке 470 /usr/lib64/perl5/Time/Piece.pm

Любая помощь приветствуется.


person Paulius    schedule 10.07.2015    source источник
comment
См. DateTime::Format::Strptime .. В нем есть и %N, и %z ..   -  person Håkon Hægland    schedule 10.07.2015
comment
Формат известен как календарная дата и время дня ISO 8601 с указателем зоны в расширенном формате. Time :: Moment- ›from_string может использоваться для его анализа.   -  person chansen    schedule 10.07.2015


Ответы (2)


Думаю, есть пара проблем.

%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}+/+/;
person Sobrique    schedule 10.07.2015

Вы можете использовать strptime в Time::Piece и добавить часовой пояс вручную, как показано в этом ответе, или вы можете попробовать использовать _ 3_ вместо этого:

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
person Håkon Hægland    schedule 10.07.2015
comment
Тогда %N в нем работает? - person Sobrique; 10.07.2015