繁体   English   中英

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

[英]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));

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

使用Date::Simple

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM