2011-11-21 48 views
9

Tôi đã cố gắng chuyển đổi một chuỗi cho đến nay trong perl, nhưng gặp lỗi.perl cách chuyển đổi chuỗi thành Ngày giờ?

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

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

lỗi

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

Hình như việc nhập khẩu bao bì có vấn đề ...

Cảm ơn

Trả lời

16

Ngày giờ không phân tích ngày tháng. Tôi muốn đi cho các mô-đun Time::Piece lõi cung cấp cho bạn 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

Tại sao, khi có một mô-đun cốt lõi, mọi người có nên sử dụng DateTime cho các hoạt động ngày đơn giản với perl không? (Tôi mới đến perl, đây là câu hỏi về genuin) – Relequestual

+0

@Relequestual 'DateTime' cung cấp khả năng tính toán thời lượng ngày (ví dụ: số ngày giữa hai ngày) trong số những thứ khác. Có lẽ tính năng quan trọng nhất của nó là nó hoạt động với lịch thay vì thời gian. Do đó, bạn có thể tính toán giá trị của "ngày hôm qua" mà không tính đến thời gian tiết kiệm ánh sáng ban ngày và thời gian không tồn tại. Xem tài liệu về mô-đun và [FAQ4] (http://perldoc.perl.org/perlfaq4.html#How-do-I-find-yesterday%27s-date?) – JRFerguson

0

Từ các tài liệu mô-đun: This module does not parse dates

Bạn cần phải thêm mã ví dụ như được đề xuất trong I printed a date with strftime, how do I parse it again? để chuyển đổi từ chuỗi thành đối tượng ngày tháng.

+0

Tôi thay đổi điều này, vẫn không hoạt động. sử dụng DateTime; $ dateStr = '20111121' của tôi; my $ year = substr ($ dateStr, 0,4); $ month = substr ($ dateStr, 4,2) của tôi; my $ day = substr ($ dateStr, 6,2); in $ năm. "/".$month."/".$day."\n" my $ date = DateTime-> new ( year => $ year, month => $ month, day => $ day, ); – user595234

+0

Tôi đã tìm ra lý do. cảm ơn – user595234

19

DateTime chính nó không có cơ sở phân tích, nhưng có rất nhiều parsers rằng gererate đối tượng DateTime. Hầu hết thời gian, có thể bạn sẽ muốn 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'); 

Hoặc bạn có thể tự làm.

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', 
); 
Các vấn đề liên quan