如何找到比Perl中给定日期提前3天的日期,格式为YYYY-MM-DD?
答案 0 :(得分: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));
该模块具有大量的时间转换例程,特别是那些处理增量的例程。 DateTime
和Date::Manip
也值得一试。
答案 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 );
答案 2 :(得分: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)
答案 3 :(得分:4)
有很多选择,它适度令人尴尬。这部分取决于您将来可能需要进行的其他计算,以及时间和时区是否会成为一个因素,以及类似的事情。
您可以查看其中任何一个
Date::Calc
Date::Manip
DateTime::*
- 另请参阅datetime.perl.org(虽然该网站似乎没有在2009-09-01T22:30-07:00 上回复)命名三个(组)模块。为简单起见,我建议Date::Calc
或Date::Manip
- 但如果您将来需要获得幻想,DateTime
模块可能会更好。
答案 4 :(得分:1)
请参阅perldoc POSIX
了解函数mktime()
。
它可以帮助您将日期和时间转换为一个简单的数字,即Unix时间(我相信自1970年1月1日以来的秒数)。然后,只需减去3(天)时间24(一天中的小时)乘以60(一小时内的分钟)乘以60(一分钟内的秒数),或从该数字中减去259200秒,然后使用localtime()
将其转换为返回字符串表示的秒数。
这可能是最好的解决方案*,因为它会自动处理月份和年份的变化。在考虑检查我们是否在一个月内用完了几天,或者在一年内用完了几个月之后,任何其他解决方案可能会变得更加复杂。
编辑: *查看CPAN
之外。
答案 5 :(得分:0)
关于mktime
的巧妙之处在于它可以处理任何偏移时间。它使用January = 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 );
答案 6 :(得分:0)