2011-11-21 10 views
9

Próbowałem przekonwertować ciąg na bieżąco w perlu, ale dostaję błąd.perl jak przekonwertować ciąg na Datetime?

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

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

błąd

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

Wygląda import pakiet ma problem ...

Dzięki

Odpowiedz

16

DateTime nie analizuje dat. pójdę do modułu Time::Piece rdzenia, który daje 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

Dlaczego, kiedy istnieje moduł podstawowy, ludzie polecają używanie DateTime do prostych operacji na dacie z Perl? (Jestem nowy w perlu, to jest pytanie w języku oryginalnym) – Relequestual

+0

@Relequestual 'DateTime' oferuje możliwość obliczania czasu trwania dat (np. Liczby dni między dwiema datami) między innymi. Być może jego najważniejszą cechą jest to, że działa z kalendarzami zamiast razy. W związku z tym można obliczyć wartość "wczoraj" bez uwzględniania czasu letniego i nieistniejących czasów. Zobacz dokumentację modułu i [FAQ4] (http://perldoc.perl.org/perlfaq4.html#How-do-I- find-yesterday%27s-date?) – JRFerguson

0

Z dokumentacji modułu: This module does not parse dates

Trzeba dodać kod, na przykład jak zasugerowano w I printed a date with strftime, how do I parse it again?, aby przekonwertować z a ciąg do obiektu z datą.

+0

Zmieniam się, nadal nie działa. używaj DateTime; my $ dateStr = '20111121'; my $ year = substr ($ dateStr, 0,4); my $ month = substr ($ dateStr, 4,2); my $ day = substr ($ dateStr, 6,2); wydrukuj $ rok. "/".$month."/".$day."\n" my $ date = DateTime-> new ( rok => $ rok, miesiąc => $ miesiąc, dzień => $ dzień, ); – user595234

+0

Dowiedziałem się, dlaczego. dzięki – user595234

19

sama DateTime ma siłownia parsowania, ale istnieje wiele parsers że gererate obiektów DateTime. Przez większość czasu prawdopodobnie będziesz chciał 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'); 

Lub możesz zrobić to sam.

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', 
); 
Powiązane problemy