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?
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.
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");
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);
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');
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