【发布时间】:2025-05-28 02:35:01
【问题描述】:
我试图在 Perl 中获取开始日期和结束日期之间的每个单独的日期。我最初使用以下代码完成了 7 天:
use Time::ParseDate;
my $newdate;
my $newtime;
my @dates = ();
my $newtime->[0] = parsedate($start_datetime);
my $newdate->[0] = strftime("%Y-%m-%d",localtime($newtime->[0]));
push(@dates, $newdate->[0]);
my $newtime->[1] = parsedate($newdate->[0]) + (1 * 24 * 60 * 60);
my $newdate->[1] = strftime("%Y-%m-%d",localtime($newtime->[1]));
push(@dates, $newdate->[1]);
my $newtime->[2] = parsedate($newdate->[1]) + (1 * 24 * 60 * 60);
my $newdate->[2] = strftime("%Y-%m-%d",localtime($newtime->[2]));
push(@dates, $newdate->[2]);
my $newtime->[3] = parsedate($newdate->[2]) + (1 * 24 * 60 * 60);
my $newdate->[3] = strftime("%Y-%m-%d",localtime($newtime->[3]));
push(@dates, $newdate->[3]);
my $newtime->[4] = parsedate($newdate->[3]) + (1 * 24 * 60 * 60);
my $newdate->[4] = strftime("%Y-%m-%d",localtime($newtime->[4]));
push(@dates, $newdate->[4]);
my $newtime->[5] = parsedate($newdate->[4]) + (1 * 24 * 60 * 60);
my $newdate->[5] = strftime("%Y-%m-%d",localtime($newtime->[5]));
push(@dates, $newdate->[5]);
my $newtime->[6] = parsedate($newdate->[5]) + (1 * 24 * 60 * 60);
my $newdate->[6] = strftime("%Y-%m-%d",localtime($newtime->[6]));
push(@dates, $newdate->[6]);
my $newtime->[7] = parsedate($newdate->[6]) + (1 * 24 * 60 * 60);
my $newdate->[7] = strftime("%Y-%m-%d",localtime($newtime->[7]));
push(@dates, $newdate->[7]);
但意识到它应该能够工作任意天数。 所以我尝试了下面的循环,但它对我来说不太有效
my $newdate;
my $newtime;
my @dates = ();
my $start_date = substr($start_datetime, 0, 10) ;
$start_date =~ s/-//gi;
my $end_date = substr($end_datetime, 0, 10) ;
$end_date =~ s/-//gi;
my $days = yyyymmdd_to_rata_die($end_date) - yyyymmdd_to_rata_die($start_date);
my $newtime->[0] = parsedate($xml->{action_content}->{start_date});
my $newdate->[0] = strftime("%Y-%m-%d",localtime($newtime->[0]));
push(@dates, $newdate->[0]);
for(my $x=1;$x<$days;$x++)
{
my $newtime->[$x] = parsedate($newdate->[$x-1]) + (1 * 24 * 60 * 60);
my $newdate->[$x] = strftime("%Y-%m-%d",localtime($newtime->[$x]));
push(@dates, $newdate->[$x]);
}
我从 * 上的一个问题中得到了下面的函数
sub yyyymmdd_to_rata_die
{
use integer;
my ( $y, $m, $d ) = $_[0] =~ /\A([0-9]{4})([0-9]{2})([0-9]{2})\z/
or return;
my $adj;
if ( $m <= 2 )
{
$y -= ( $adj = ( 14 - $m ) / 12 );
$m += 12 * $adj;
}
elsif ( $m > 14 )
{
$y += ( $adj = ( $m - 3 ) / 12 );
$m -= 12 * $adj;
}
$d += ( $m * 367 - 1094 ) / 12 + $y % 100 * 1461 / 4 + ( $y / 100 * 36524 + $y / 400 ) - 306;
}
任何帮助将不胜感激
编辑: $start_datetime = "2014-09-01 00:00:00"; $end_datetime = "2014-09-07 23:59:59";
我需要开始和结束日期之间的所有日子,即。
2014-09-01
2014-09-02
2014-09-03
2014-09-04
2014-09-05
2014-09-06
2014-09-07
【问题讨论】:
-
请举例说明您需要的输入和对应的输出。
-
您的代码表明您使用的是
XML::Simple。如果你是,那么我强烈建议你转向别的东西,因为使用它绝非简单。