web-dev-qa-db-fra.com

Comment analyser une chaîne dans un objet DateTime en Perl?

Je connais le module Perl DateTime et beaucoup de DateTime::Format:: modules pour analyser des types spécifiques de formats de date/heure. Cependant, étant donné quelques exemples de chaînes de date/heure, comment puis-je savoir (au moment du codage/de la conception, et non à l'exécution) quel module spécifique dois-je utiliser ?

Par exemple, je veux analyser des chaînes comme: October 28, 2011 9:00 PM PDT

Existe-t-il une liste des formats de date/heure les plus courants où je pourrais rechercher ceci et trouver le module le plus approprié?

Je connais également certains modules qui essaient de "deviner" le format de chaque chaîne donnée lors de l'exécution et font de leur mieux. Mais, pour les applications sensibles, je voudrais déterminer (aussi strictement que possible) le format lors de la conception d'une application, puis utiliser un module qui m'avertira si une chaîne ne correspond pas au format spécifié.

Comment dois-je procéder?

31
Juan A. Navarro

DateTime :: Format :: Strptime prend les chaînes de date/heure et les analyse en objets 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";

Les séquences de caractères utilisées dans le modèle sont standard POSIX. Voir 'man strftime' pour plus de détails.

42
Dave Cross

J'ai tendance à utiliser Time :: Piece simplement parce qu'il fait partie de l'ensemble de modules Perl standard depuis la version 5.1 .

Vous ne pouvez pas battre sa capacité à analyser les chaînes de date .

my $time = Time::Piece->strptime(
      "October 28, 2011 9:00 PM PDT",
      "%B %d, %Y %r %Z");
30
David W.

Jetez un œil au module Date::Parse, C'est-à-dire la fonction str2time(). Il prend en charge la plupart des formats couramment utilisés.

Exemple:

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);
13
ErikR

Si vous recherchez des formats de date/heure courants, jetez un œil à DateTime :: Locale

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

Les méthodes suivantes renvoient des chaînes appropriées pour la méthode 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()

Vous pouvez analyser les dates avec le module 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');
4
key_