2011-11-21 48 views
9

He intentado convertir una cadena a la fecha en Perl, pero obtengo un error.perl cómo convertir una cadena a Datetime?

use strict; 
use warnings; 
use DateTime; 
use Date::Manip; 

my $date = ParseDate("20111121"); 
print "today is ".$date->day_of_week."\n"; 

error

Can't call method "day_of_week" without a package or object reference 

Parece que la importación paquete tiene un problema ...

Gracias

Respuesta

16

DateTime no analiza las fechas. Yo iría a por el módulo Time::Piece central que le da strptime():

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Time::Piece; 
my $t = Time::Piece->strptime("20111121", "%Y%m%d"); 
print $t->strftime("%w\n"); 
+0

¿Por qué, cuando hay un módulo central, la gente recomienda utilizar DateTime para operaciones de fecha simple con Perl? (Soy nuevo en Perl, esta es una pregunta genuina) – Relequestual

+0

@Relequestual 'DateTime' ofrece la capacidad de calcular duraciones de fecha (por ejemplo, el número de días entre dos fechas), entre otras cosas. Tal vez su característica más importante es que funciona con calendarios en lugar de veces. Por lo tanto, puede calcular el valor de "ayer" sin tener en cuenta el horario de verano y los tiempos inexistentes. Consulte la documentación del módulo y [FAQ4] (http://perldoc.perl.org/perlfaq4.html#How-do-I-find-yesterday%27s-date?) – JRFerguson

0

De la documentación del módulo: This module does not parse dates

Es necesario añadir dicho código como se sugiere en I printed a date with strftime, how do I parse it again? para convertir de un cadena a un objeto de fecha y hora.

+0

Me cambio a esto, todavía no funciona. usa DateTime; my $ dateStr = '20111121'; my $ year = substr ($ dateStr, 0,4); my $ month = substr ($ dateStr, 4,2); my $ day = substr ($ dateStr, 6,2); print $ year. "/".$$th."/".$day."\n" my $ date = DateTime-> new ( year => $ year, month => $ month, day => $ day, ); – user595234

+0

Descubrí el motivo. gracias – user595234

19

DateTime en sí no tiene instalación de análisis, pero hay muchos que parsers gererate objetos DateTime. La mayoría de las veces, probablemente querrás DateTime::Format::Strptime.

use DateTime::Format::Strptime qw(); 
my $format = DateTime::Format::Strptime->new(
    pattern => '%Y%m%d', 
    time_zone => 'local', 
    on_error => 'croak', 
); 
my $dt = $format->parse_datetime('20111121'); 

O puede hacerlo usted mismo.

use DateTime qw(); 
my ($y,$m,$d) = '20111121' =~ /^([0-9]{4})([0-9]{2})([0-9]{2})\z/ 
    or die; 
my $dt = DateTime->new(
    year  => $y, 
    month  => $m, 
    day  => $d, 
    time_zone => 'local', 
); 
Cuestiones relacionadas