Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中找到比给定日期早三天的日期?_Perl_Date - Fatal编程技术网

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

如何在Perl中找到比给定日期早三天的日期?,perl,date,Perl,Date,如何在Perl中找到比给定日期早3天的日期,格式为YYYY-MM-DD?有关函数,请参阅 它将帮助您将日期和时间转换为一个简单的数字,即Unix时间(我相信是自1970年1月1日以来的秒数)。然后,只需从该数字中减去3(天)乘以24(一天中的小时)乘以60(一小时中的分钟)乘以60(一分钟中的秒),或259200秒,然后使用将该秒数转换回字符串表示形式 这可能是最好的解决方案*,因为它将自动处理月份和年份的变化。任何其他的解决方案都可能在考虑到我们是在一个月内用完了天数,还是在一年内用完了月份之

如何在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没有响应)
只命名三(组)个模块。为了简单起见,我建议使用或,但如果您将来需要使用,模块可能会更好。

最妙的是,它可以处理任何时间的偏移。它使用一月=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 );
这很简单

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)