Как разбирать строку в объект DateTime в Perl?
Я знаю о модуле DateTime
Perl и многих DateTime::Format::
для анализа отдельных видов форматов даты и времени. Однако, учитывая некоторые примеры строк даты/времени, как я могу определить (во время кодирования/проектирования, а не во время выполнения), какой конкретный модуль использовать?
Например, я хочу разбирать строки типа: October 28, 2011 9:00 PM PDT
Есть ли список где-то из наиболее распространенных форматов даты и времени, где я мог бы посмотреть это и найти, какой из них будет наиболее подходящим?
Я также знаю о некоторых модулях, которые пытаются "угадать" формат для каждой данной строки во время выполнения и делать все возможное. Но для чувствительных приложений я хотел бы сначала определить (как можно более строго) формат при разработке приложения, а затем использовать модуль, который предупредит меня, если строка не соответствует указанному формату.
Как мне это сделать?
Ответы
Ответ 1
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".
Ответ 2
Я обычно использую Time:: Piece просто потому, что он является частью стандартного модуля Perl, установленного с версии 5.10.
Вы не можете победить его в синтаксические строки даты.
my $time = Time::Piece->strptime(
"October 28, 2011 9:00 PM PDT",
"%B %d, %Y %r %Z");
Ответ 3
Посмотрите на модуль 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
Если вы ищете общие форматы даты и времени
посмотрите 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');