2009-09-02 51 views

回答

10

Date::Calc是冠軍模塊的位置:

use strict; 
use warnings; 
use Date::Calc qw(Add_Delta_YMD); 

my $startDate = '2000-01-01'; 
my ($startYear, $startMonth, $startDay) = $startDate =~ m/(\d{4}-(\d{2})-\d{2})/; 

# 1 year, 2 months, 3 days, after startDate 
my $endDate = join('-', Add_Delta_YMD($startYear, $startMonth, $startDay, 1, 2, 3)); 

該模塊有時間轉換例程,尤其是涉及增量的數量巨大。 DateTimeDate::Manip也值得一試。

1

請參閱perldoc POSIX的功能mktime()

它將幫助您將日期和時間轉換爲一個簡單的數字,這是Unix時間(自1970年1月1日以來的秒數,我相信)。然後,只需從該數字中減去24(一天中的小時數)乘以60(一小時中的幾分鐘)乘以60(乘以一分鐘的秒數)或259200秒中的3(天)次,並使用localtime()將該秒數到一個字符串表示。

這可能是最好的解決方案*,因爲它會自動處理月份和年份更改。考慮到我們是否在一個月內耗盡了幾天,或者在一年中耗盡了幾個月,任何其他解決方案可能最終變得更加複雜。


編輯: *一致看好CPAN外面。

+2

如果你要做到這一點,我會建議使用一天中的時間作爲mktime的輸入,而不是sec,min,hour = 0,以避免出現任何問題夏令時等,然後從本地時間中丟棄時間組件 – Cebjyre

+2

無論如何,使用Date :: Calc或其他一些CPAN模塊可能會更好,我只是沒有掌握真正的Perl主控的CPAN知識。 。 –

+1

這在某些情況下會失敗。每個人都認爲這是一個簡單的問題,但他們從來沒有真正考慮過如何才能做到這一點。 –

9

Date::Calc可用於這樣的計算:

#!/usr/bin/perl 

use strict; 
use warnings; 
use Date::Calc qw(Add_Delta_Days); 

my ($yyyy, $mm, $dd) = (2009, 9, 2); 
my @date = Add_Delta_Days($yyyy, $mm, $dd, -3); 
print join('-', @date); 
4

有這麼多的選擇,它是適度尷尬。它部分取決於您將來可能需要的其他計算方式,以及時間和時區是否會成爲一個因素,以及類似的事情。

你可以看任何這些

給名稱,但三(組)模塊。爲簡單起見,我建議使用Date::CalcDate::Manip - 但如果您將來需要更加喜歡,DateTime模塊可能會更好。

+0

http://stackoverflow.com/revisions/bd3f965e-1edb-47b2-bbd0-b4149fd5af18/view-source –

+0

@Brad:感謝網址上的修正。 –

0

關於mktime的整潔的事情是它可以處理任何偏移量的時間。它使用1月= 0; 2009年= 109這個計劃。因此,印月 - 1和全年 - 1900

use POSIX qw<mktime>; 

my ($year, $month, $day) = split '-', $date; 
my $three_day_prior = mktime(0, 0, 0, $day - 3, $month - 1, $year - 1900); 

mktime對查找月的最後一天也有用。你只要到下個月的第0天。

mktime(0, 0, 0, 0, $month, $year - 1900); 
0

這是Date::Simple

C:\>perl -MDate::Simple=today -e "print today()-3" 
 
2009-08-30 
+0

你可以更新你的答案,以顯示如何將字符串'2009-09-04'轉換爲答案'2009-09-01';也就是說,不是使用'today()',而是如何將給定的字符串轉換爲內部格式? –

+0

C:\> perl -MDate :: Simple = date -e「print date('2009-09-04') - 3」 2009-09-01 –

6

DateTime簡單,是對付現代的Perl日期的正規途徑:

use DateTime; 

my ($year, $month, $day) = split '-', '2009-09-01'; 

my $date = DateTime->new(year => $year, month => $month, day => $day); 

$date->subtract(days => 3); 

# $date is now three days earlier (2009-08-29T00:00:00) 
相關問題