Как разобрать строку в объект DateTime в Perl? - PullRequest
31 голосов
/ 20 сентября 2011

Я знаю о Perl-модуле DateTime и о многих модулях DateTime::Format:: для анализа определенных типов форматов даты / времени. Однако, учитывая некоторые примеры строк даты / времени, как я могу определить (во время кодирования / разработки, , а не во время выполнения), какой конкретный модуль мне следует использовать?

Например, я хочу разобрать строки вроде: October 28, 2011 9:00 PM PDT

Есть ли где-нибудь список наиболее распространенных форматов даты / времени, где я мог бы найти это и найти наиболее подходящий модуль?

Я также знаю о некоторых модулях, которые пытаются "угадать" формат для каждой данной строки во время выполнения и делают все возможное. Но для чувствительных приложений я хотел бы определить (как можно более строго) формат сначала при разработке приложения, а затем использовать модуль, который предупредит меня, если строка не соответствует указанному формату.

Как мне поступить об этом?

Ответы [ 4 ]

42 голосов
/ 20 сентября 2011

DateTime :: Format :: Strptime принимает строки даты / времени и анализирует их в объекты DateTime.

#!/usr/bin/perl

use strict;
use warnings;

use DateTime::Format::Strptime;

my $parser = DateTime::Format::Strptime->new(
  pattern => '%B %d, %Y %I:%M %p %Z',
  on_error => 'croak',
);

my $dt = $parser->parse_datetime('October 28, 2011 9:00 PM PDT');

print "$dt\n";

Последовательности символов, используемые в шаблоне, соответствуют стандарту POSIX.Подробности смотрите в man strftime.

30 голосов
/ 20 сентября 2011

Я склонен использовать Time :: Piece просто потому, что он входит в стандартный набор модулей Perl начиная с версии 5.10 .

Вы не можете превзойти его способности разбирать строки даты .

my $time = Time::Piece->strptime(
      "October 28, 2011 9:00 PM PDT",
      "%B %d, %Y %r %Z");
13 голосов
/ 20 сентября 2011

Посмотрите на модуль Date::Parse, то есть функцию str2time(). Он поддерживает большинство распространенных форматов.

Пример:

use Date::Parse;
use DateTime;

my $str = "Tue, 20 Sep 2011 08:51:08 -0500";
my $epoch = str2time($str);
my $datetime = DateTime->from_epoch(epoch => $epoch);
4 голосов
/ 31 июля 2013

Если вы ищете распространенные форматы даты / времени взгляните на DateTime :: Locale

use DateTime::Locale
my $locale = DateTime::Locale->load('DE_de');

Следующие методы возвращают строки, соответствующие методу DateTime-> format_cldr ():

$locale->date_format_full()
$locale->date_format_long()
$locale->date_format_medium()
$locale->date_format_short()
$locale->date_format_default()
$locale->time_format_full()
$locale->time_format_long()
$locale->time_format_medium()
$locale->time_format_short()
$locale->time_format_default()
$locale->datetime_format_full()
$locale->datetime_format_long()
$locale->datetime_format_medium()
$locale->datetime_format_short()
$locale->datetime_format_default()

Вы можете проанализировать даты с помощью DateTime :: Format :: CLDR модуля

use DateTime::Format::CLDR;
# 1. Basic example
my $cldr = DateTime::Format::CLDR->new(
    pattern     => 'dd.MM.yyyy HH:mm:ss',
    locale      => 'de_DE',
    time_zone   => 'Europe/Berlin',
);
my $dt = $cldr->parse_datetime('26.06.2013 11:05:28');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...