[英]How do I find a date which is three days earlier than a given date in Perl?
如何找到比Perl中给定日期提前3天的日期,格式为YYYY-MM-DD?
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
也值得一试。
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 );
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)
它有很多选择,令人尴尬。 这部分取决于您将来可能需要的其他计算,以及时间和时区是否会成为一个因素,以及类似的事情。
你可以看看其中的任何一个
Date::Calc
Date::Manip
DateTime::*
- 另请参见datetime.perl.org ( 尽管该网站似乎没有响应2009-09-01T22:30-07:00 ) 仅列出三个(套)模块。 为简单起见,我建议使用Date::Calc
或Date::Manip
- 但如果您将来需要获得幻想, DateTime
模块可能会更好。
有关函数mktime()
请参阅perldoc POSIX
。
它将帮助您将日期和时间转换为一个简单的数字,即Unix时间(我相信1970年1月1日以来的秒数)。 然后,只需减去3(天)时间24(一天中的小时)乘以60(一小时中的分钟)乘以60(一分钟内的秒数),或从该数字中减去259200秒,并使用localtime()
来转换该数量秒返回字符串表示。
这可能是最好的解决方案*,因为它会自动处理月份和年份的变化。 在考虑检查我们是否在一个月内用完了几天,或者在一年内用完了几个月之后,任何其他解决方案可能会变得更加复杂。
编辑: *在寻找CPAN
。
关于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 );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.