2011-08-12 48 views
5

Tất cả những gì tôi đang cố gắng làm ở đây là ngày hoặc tháng là một chữ số duy nhất, để thêm một số không ở mặt trước của nó. Ngay bây giờ nó in ra ngày như 201.188, và tôi đang tìm kiếm 20110808.Ngày tháng :: Calc - định dạng ngày và tháng

#!/usr/bin/perl 
use Date::Calc qw(Add_Delta_Days); 
my (undef, undef, undef, $day, $month, $year) = localtime(); 
$year +=1900; 
$month +=1; 
($year, $month, $day) = Add_Delta_Days($year, $month, $day, -3) 
if ($month =~ /\d{1}/){ 
    s/$month/0$month/ 
} 
if ($day =~/\d{1}/){ 
    s/$day/0$day/ 
} 
print $year,$month,$day; 
+0

của bạn nếu-tuyên bố không có ý nghĩa. Trước hết, chúng sẽ luôn chứa một chữ số (1 hoặc 2), vì vậy các câu lệnh if sẽ luôn đúng. Thứ hai, bạn đang thực hiện một thay thế trên biến '$ _', không phải' $ month' và '$ day'. – TLP

+0

@TLP, anh ấy đã đăng mã mà anh ấy hiện có, không hoạt động (vì những lý do bạn đề cập). Đó là câu hỏi của anh ấy. Nhận xét của bạn phải là câu trả lời thay thế. – cjm

+0

thực sự tôi nghĩ rằng @ TLP chỉ ra một cái gì đó mà tôi cần phải hiểu. về câu lệnh if và biến $ _ mặc định. – capser

Trả lời

2

if ($ tháng < 10)
{
          $ tháng = "$ 0 tháng" ;
}

if ($ ngày < 10)
{
          $ ngày = "0 $ ngày";
}

+0

vâng tôi nghĩ đây là một cách đơn giản và ngắn gọn để làm điều đó - cảm ơn bạn – capser

+2

Xin đừng. Nếu bạn đưa kết quả này đến một nơi nào đó, Perl sẽ lại bỏ qua số 0 đứng đầu vì nó sẽ xử lý chuỗi như một số. Sử dụng printf để in định dạng. – Olfan

4

Sử dụng printf thay vì:

printf "%d-%02d-%02d", $year, $month, $day; 

Cung cấp đầu ra như:

C:\perl>perl -we "printf qq(%d-%02d-%02d), 2011,5,4" 
2011-05-04 
C:\perl>perl -we "printf qq(%d-%02d-%02d), 2011,5,12" 
2011-05-12 
C:\perl>perl -we "printf qq(%d-%02d-%02d), 2011,22,12" 
2011-22-12 
+1

Tôi muốn nói rằng '% 02d' là thành ngữ hơn'% .2d'. –

+0

@Keith Cảm ơn, đã được khắc phục ngay bây giờ. – TLP

+0

Và chỉ để đối xứng, tôi thường viết '"% 04d-% 02d-% 02d "'. (Một điểm nhỏ, và một mà không có sự khác biệt thực sự trong nhiều năm> = 1000.) –

5

Nếu bạn hài lòng sử dụng Date::Calc, tại sao không sử dụng DateTime?

use DateTime; 
my $date = DateTime->now; 
$date->subtract(days => 3); 
print $date->ymd; 

Trong thực tế, bạn có thể giảm đến:

print DateTime->now->subtract(days => 3)->ymd 
+0

+1 Đẹp nhất, tôi nên nghĩ về điều này. ;) – TLP

Các vấn đề liên quan