如何在格式爲YYYY-MM-DD的Perl中查找比給定日期早3天的日期?如何在Perl中找到比給定日期早三天的日期?
回答
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));
該模塊有時間轉換例程,尤其是涉及增量的數量巨大。 DateTime
和Date::Manip
也值得一試。
請參閱perldoc POSIX
的功能mktime()
。
它將幫助您將日期和時間轉換爲一個簡單的數字,這是Unix時間(自1970年1月1日以來的秒數,我相信)。然後,只需從該數字中減去24(一天中的小時數)乘以60(一小時中的幾分鐘)乘以60(乘以一分鐘的秒數)或259200秒中的3(天)次,並使用localtime()
將該秒數到一個字符串表示。
這可能是最好的解決方案*,因爲它會自動處理月份和年份更改。考慮到我們是否在一個月內耗盡了幾天,或者在一年中耗盡了幾個月,任何其他解決方案可能最終變得更加複雜。
編輯: *一致看好CPAN
外面。
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);
有這麼多的選擇,它是適度尷尬。它部分取決於您將來可能需要的其他計算方式,以及時間和時區是否會成爲一個因素,以及類似的事情。
你可以看任何這些
Date::Calc
Date::Manip
DateTime::*
- 又見datetime.perl.org(但該網站似乎沒有要在2009-09-01T22響應:30- 07:00)
給名稱,但三(組)模塊。爲簡單起見,我建議使用Date::Calc
或Date::Manip
- 但如果您將來需要更加喜歡,DateTime
模塊可能會更好。
http://stackoverflow.com/revisions/bd3f965e-1edb-47b2-bbd0-b4149fd5af18/view-source –
@Brad:感謝網址上的修正。 –
關於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);
你可以更新你的答案,以顯示如何將字符串'2009-09-04'轉換爲答案'2009-09-01';也就是說,不是使用'today()',而是如何將給定的字符串轉換爲內部格式? –
C:\> perl -MDate :: Simple = date -e「print date('2009-09-04') - 3」 2009-09-01 –
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)
- 1. powerpivot日期比今天早
- 2. 從給定的日期找到一天
- 3. 驗證輸入的日期比今天的日期更早
- 4. 比較日期到今天的日期
- 5. 如何在給定日期的perl中查找以前的日期
- 6. 過濾日期比今天早嗎?
- 7. xslt比當前日期早90天
- 8. 在DatePicker插件中禁用日期比今日早的日期
- 9. XQuery - 如何在給定日期的日期前90天獲取?
- 10. 如何從今天的日期得到下三個日期
- 11. 今天怎麼日期比較給定日期
- 12. 如何比較當前日期和Jtable中的給定日期?
- 13. 如何在PHP中查找比其他日期晚1天的日期?
- 14. 如何比較xml行中的日期和今天的日期
- 15. 如何使用perl查找給定日期的下一個日期?
- 16. 相對於給定日期得到一天的日期
- 17. 轉換日期到給定日期的兩天
- 18. 日期最接近但比基於其他因素給定的日期早
- 19. 如何在Crystal Reports中過濾日期早於3天的日期?
- 20. 如何比較日期並獲取不應該在今天的日期日期
- 21. 如何找到天的兩個日期
- 22. 在MongoDB中的日期:當將日期對象插入Mongo數據庫時,日期比它自己早1天
- 23. 如何找到給定的日期是在指定日期範圍內
- 24. 如果日期不足,則給日期列「今天」日期
- 25. 如何從數據庫中找到最早的日期和最新日期
- 26. 在Perl中如何查找給定日期的上一個星期一的日期?
- 27. CodeIgniter日曆日期顯示 - 在生產早期顯示一天
- 28. 如何僅在HTML中顯示日期到今天的日期?
- 29. 我想在給定日期後顯示明天的日期
- 30. 如何確定Java中給定日期之前一天的日期?
如果你要做到這一點,我會建議使用一天中的時間作爲mktime的輸入,而不是sec,min,hour = 0,以避免出現任何問題夏令時等,然後從本地時間中丟棄時間組件 – Cebjyre
無論如何,使用Date :: Calc或其他一些CPAN模塊可能會更好,我只是沒有掌握真正的Perl主控的CPAN知識。 。 –
這在某些情況下會失敗。每個人都認爲這是一個簡單的問題,但他們從來沒有真正考慮過如何才能做到這一點。 –