2011-08-12 21 views
5

Tek yapmam gereken şey, gün veya ayın tek haneli olması, 'un önüne sıfır eklemektir. Şu anda bu 201188 olarak tarihini basar ve ben 20110808.Tarih :: Calc - günü ve ayı biçimlendirin

#!/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

Sizin eğer-tablolar anlamı yok:

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

Aslında sen o azaltabilir. Öncelikle, her zaman bir rakam (1 veya 2) içerecektir, bu nedenle if ifadeleri her zaman doğru olacaktır. İkincisi, '$ _' değişkeninde, $ month' ve '$ day' yerine bir ikame gerçekleştiriyorsunuz. – TLP

+0

@TLP, şu anda sahip olduğu kodu yayınladı (çalışmadığınız nedenlerden dolayı). Bu onun sorusu. Yorumunuz bunun yerine bir cevap olmalıdır. – cjm

+0

aslında bence @TLP anlamanız gereken bir şey işaret etti. if ifadesi ve $ _ default değişkeni hakkında. – capser

cevap

2

arıyorum if ($ ay < 10)
{
          $ ay = "0 $ ay" ;
}

halinde ($ gün < 10)
{
          $ gün = "0 $ günü";
}

+0

Evet, bunun güzel ve basit bir şekilde yapıldığını düşünüyorum - teşekkürler – capser

+2

Lütfen yapmayın. Bunun sonucunu başka bir yere uzatırsanız, Perl, dizgiyi bir sayı olarak işleyeceği için baştaki sıfırı atlayacaktır. Biçimlendirilmiş yazdırma için printf kullanın. – Olfan

4

Kullanım printf yerine:

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

"% 02d" nin,% .2d'den daha idiomatik olduğunu söyleyebilirim. –

+0

@Keith Teşekkürler, şimdi düzeltildi. – TLP

+0

Ve simetri için genelde "% 04d-% 02d-% 02d" 'yazarım. (Küçük bir nokta, ve yıllarca gerçek bir fark yaratan> 1000). –

5

Eğer Date::Calc kullanmak memnunsanız, neden olmasın DateTime kullanın:

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

çıkış gibi verir?

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

+1 Güzel olanı düşünmeliydim. ;) – TLP

İlgili konular