Подтвердить что ты не робот

Как разбирать строку в объект DateTime в Perl?

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

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

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

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

Как мне это сделать?

4b9b3361

Ответ 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');