Распознание формата даты и времени

Типовая задача — есть строка даты, её надо распрознать. Есть много парсеров DateTime::Format::* , проблема выбрать нужный. Скрипт ниже перебирает все и выдаёт те, которые справились с задачей.

#!bash
root@superserver:~$ ./find-datetime-parser.pl  "Mon, 9 Mar 2015 14:35:49 +0300"
Тестируем парсеры для 'Mon, 9 Mar 2015 14:35:49 +0300'
Формат распознан 2015-03-09T14:35:49 +0300 DateTime::Format::DateParse 
Формат распознан 2015-03-09T14:35:49 +0300 DateTime::Format::HTTP 
Формат распознан 2015-03-09T14:35:49 +0300 DateTime::Format::Mail

Описание парсеров на странеце Perl — Разные парсеры дат для DateTime модуля

#!perl
#!/usr/bin/env perl
use perl5i::2;
use DateTime::Format::HTTP;
use DateTime::Format::ICal;
use DateTime::Format::Atom;
use DateTime::Format::RFC3501;
use DateTime::Format::RFC3339;
use DateTime::Format::ISO8601;
use DateTime::Format::W3CDTF;
use DateTime::Format::DateParse;
use DateTime::Format::Mail;

sub test {
  my $datetimestr = shift;
  my @parsers     = (
    'DateTime::Format::ICal',      'DateTime::Format::Atom',
    'DateTime::Format::RFC3501',   'DateTime::Format::RFC3339',
    'DateTime::Format::ISO8601',   'DateTime::Format::W3CDTF',
    'DateTime::Format::DateParse', 'DateTime::Format::HTTP',
    'DateTime::Format::Mail',
  );
  say "Тестируем парсеры для '$datetimestr'";
  foreach my $parser (@parsers) {
    try {
      my $dt = ($parser)->parse_datetime($datetimestr);
      if (UNIVERSAL::isa($dt, 'DateTime')) {
        say sprintf("Формат распознан %s %s %s ",
          $dt, $dt->time_zone_short_name(), $parser);
      }
      else {
        die "Формат НЕ распознан $parser";
      }
    }
    catch {
#      say "Error: $_";
    };
  }




}
my $datetimestr = shift;
test($datetimestr);

Leave a Reply