如何在Perl中找到比给定日期早三天的日期?
如何在Perl中找到比给定日期早3天的日期,格式为YYYY-MM-DD?有关函数,请参阅 它将帮助您将日期和时间转换为一个简单的数字,即Unix时间(我相信是自1970年1月1日以来的秒数)。然后,只需从该数字中减去3(天)乘以24(一天中的小时)乘以60(一小时中的分钟)乘以60(一分钟中的秒),或259200秒,然后使用将该秒数转换回字符串表示形式 这可能是最好的解决方案*,因为它将自动处理月份和年份的变化。任何其他的解决方案都可能在考虑到我们是在一个月内用完了天数,还是在一年内用完了月份之后变得更加复杂如何在Perl中找到比给定日期早三天的日期?,perl,date,Perl,Date,如何在Perl中找到比给定日期早3天的日期,格式为YYYY-MM-DD?有关函数,请参阅 它将帮助您将日期和时间转换为一个简单的数字,即Unix时间(我相信是自1970年1月1日以来的秒数)。然后,只需从该数字中减去3(天)乘以24(一天中的小时)乘以60(一小时中的分钟)乘以60(一分钟中的秒),或259200秒,然后使用将该秒数转换回字符串表示形式 这可能是最好的解决方案*,因为它将自动处理月份和年份的变化。任何其他的解决方案都可能在考虑到我们是在一个月内用完了天数,还是在一年内用完了月份之
编辑:*在观看之外。可用于此类计算:
#!/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 );
冠军模块在这里:
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));
该模块有大量的时间转换例程,尤其是那些处理增量的例程。也值得一看。选择太多了,让人有些尴尬。这在一定程度上取决于你将来可能需要什么其他计算,以及时间和时区是否会成为一个因素,以及类似的事情 你可以看看这些
- -另请参见(尽管该网站似乎在2009-09-01T22:30-07:00没有响应)
use POSIX qw<mktime>;
my ( $year, $month, $day ) = split '-', $date;
my $three_day_prior = mktime( 0, 0, 0, $day - 3, $month - 1, $year - 1900 );
这很简单
2009-08-30
是现代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)
如果你要这样做,我建议使用一天中的时间作为MKTIME的输入,而不是SEC,min,小时=0,以避免任何问题的日光节约,飞秒秒等,然后扔掉时间组件从LoalTimeTimes它可能更好地使用日期::CALC或其他一些CPAN模块反正,我只是不具备真正的Perl大师的大师级CPAN知识。在某些情况下,这会失败。每个人都认为这是一个简单的问题,但他们从来没有真正考虑过如何才能把它做好。你能更新你的答案,展示如何将字符串“2009-09-04”转换为答案“2009-09-01”;也就是说,如何将给定字符串转换为内部格式而不是使用“today()”?C:\>perl-MDate::Simple=date-e“打印日期('2009-09-04')-3“2009-09-01
C:\>perl -MDate::Simple=today -e "print today()-3"
2009-08-30
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)