2011-09-20 19 views
27

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

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

¿Hay una lista en algún lugar de los formatos más comunes de fecha/hora en el que podía ver esto y encontrar lo que sería el módulo más adecuado?

También conozco algunos módulos que intentan "adivinar" el formato de cada cadena en tiempo de ejecución y hacen todo lo posible. 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 avisará si una cadena no coincide con el formato especificado.

¿Cómo debo hacer esto?

Respuesta

36

DateTime::Format::Strptime toma las cadenas de fecha/hora y los 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. Vea 'man strftime' para más detalles.

+0

¡Gracias! Es por eso que terminé haciéndolo al final. Aún así, me gustaría ver una lista de formatos de fecha estándar o comunes (ISO, RFC) para verificar si algunas cadenas particulares que tengo se ajustan a cualquiera de ellas. –

+0

Hay una lista (desactualizada) de módulos DateTime (que incluyen una cantidad de módulos DT :: Format) en http: //datetime.perl.org/wiki/datetime/page/Módulos –

+0

No es un gran fan de tener que especificar el formato con tanta precisión – MikeKulls

14

Eche un vistazo al módulo Date::Parse, es decir, 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); 
+1

Gracias pero esto es precisamente * no * lo que quiero hacer. No quiero que la función adivine el formato de la cadena; Quiero poder especificar el formato que el código debe esperar con precisión. –

+0

Bueno, eso es precisamente lo que quiero hacer :-) Recomendaré un formato, pero si alguien lo varía, será el mejor esfuerzo. – MikeKulls

+0

En realidad, ese módulo no parece tan bueno. Se resuelve 15/4/2015 a 1429060633, pero 15/apr/2015 a 1429020000. Es difícil imaginar lo que está haciendo aquí, ya que solo tiene 11,28 horas de diferencia en las fechas de análisis. No debe haber ningún componente de tiempo. – MikeKulls

27

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 de parse date strings.

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

Lamentablemente, no es parte del módulo estándar de Perl establecido en la versión 5.8 (que sigue siendo la versión más alta que puede ejecutar en RHEL 5.x). Está en 5.14 sin embargo. –

+1

"que sigue siendo la versión más alta que se puede ejecutar en RHEL 5.x". Eso no es verdad. Es cierto que RHEL 5.x viene con Perl 5.8.8 como estándar. Pero no hay nada que le impida construir una versión más reciente. –

+2

@DaveCross Hay un cierto punto que hace Chirs. No siempre es posible instalar una versión más nueva de Perl fuera de RPM. Las máquinas RHEL generalmente se encuentran en entornos de producción corporativos (de lo contrario, ejecutaría Fedora o Centos). Estos sistemas generalmente no tienen el conjunto completo de herramientas _developer_, como el compilador C instalado en ellos, es posible que no tenga acceso a ellos para instalar herramientas, e incluso si pudiera, las personas que ejecutan el entorno de producción pueden ver sobre alguien instalando una versión no oficial de Perl en el entorno de producción. –

4

Si está buscando fecha común formatos/hora echar un vistazo a DateTime::Locale

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

The following methods return strings appropriate for the DateTime->format_cldr() method:

$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'); 
Cuestiones relacionadas