Cómo analizar una cadena en un objeto DateTime en Perl?


Conozco el módulo Perl DateTime, y muchos de los DateTime::Format:: módulos para analizar tipos específicos de formatos de fecha / hora. Sin embargo, dados algunos ejemplos de cadenas de fecha/hora, ¿cómo puedo averiguar (en tiempo de codificación/diseño, no en tiempo de ejecución) qué módulo específico debo usar?

Por ejemplo, quiero analizar cadenas como: October 28, 2011 9:00 PM PDT

¿Hay una lista en algún lugar de los formatos de fecha/hora más comunes donde podría buscar esto y encontrar cuál sería el más adecuado módulo?

También sé acerca de algunos módulos que tratan de "adivinar" el formato para cada cadena dada en tiempo de ejecución y hacer su mejor esfuerzo. Pero, para aplicaciones sensibles, me gustaría determinar (lo más estrictamente posible) el formato primero al diseñar una aplicación, y luego usar un módulo que me avise si una cadena no coincide con el formato especificado.

¿Cómo debo hacer esto?

Author: Juan A. Navarro, 2011-09-20

4 answers

DateTime::Format:: Strptime toma cadenas de fecha/hora y las analiza en objetos 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";

Las secuencias de caracteres utilizadas en el patrón son estándar POSIX. Ver 'man strftime' para más detalles.

 37
Author: Dave Cross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-17 10:26:20

Tiendo a usar Time:: Piece simplemente porque es parte del conjunto de módulos Perl estándar desde la versión 5.10.

No se puede superar su capacidad para analizar cadenas de fecha.

my $time = Time::Piece->strptime(
      "October 28, 2011 9:00 PM PDT",
      "%B %d, %Y %r %Z");
 28
Author: David W.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-11 20:10:12

Eche un vistazo al módulo Date::Parse, es decir, a la función str2time(). Tiene soporte para la mayoría de los formatos comúnmente utilizados.

Ejemplo:

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);
 14
Author: ErikR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-20 14:44:40

Si está buscando formatos de fecha/hora comunes echa un vistazo a DateTime:: Locale

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

Los siguientes métodos devuelven cadenas apropiadas para el método 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()

Puede analizar Fechas con el módulo 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
Author: key_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-17 04:09:57