如何在Perl中找到比给定日期提前三天的日期?

时间:2009-09-02 05:08:21

标签: perl date

如何找到比Perl中给定日期提前3天的日期,格式为YYYY-MM-DD?

7 个答案:

答案 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));

该模块具有大量的时间转换例程,特别是那些处理增量的例程。 DateTimeDate::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::CalcDate::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)

使用Date::Simple

这很简单
C:\>perl -MDate::Simple=today -e "print today()-3"
2009-08-30