我想要做的是,给定YYYY-MM-DD格式的开始和结束日期,编写一个函数,该函数将以该格式返回日期的键/值对,表示中间月份的开始和结束需要注意的是,第一对将从开始日期开始,最后一对将以结束日期结束。我无法找到我需要的解决方案,不过我想象Date :: Manip或Date :: Calc可以完成这项工作。
例如,如果呼叫如下:
&get_date_pairs('2014-08-18', '2014-10-17');
然后返回的函数的哈希值如下:
%hash = (
2014-08-18 => 2014-08-31,
2014-09-01 => 2014-09-30,
2014-10-01 => 2014-10-17,
);
答案 0 :(得分:2)
使用Time::Piece
:
use strict;
use warnings;
use Time::Piece;
use Time::Seconds;
my $start = '2014-08-18';
my $end = '2014-10-17';
my $fmt = '%Y-%m-%d';
# Normalized to Noon to avoid DST
my $month_start = Time::Piece->strptime( $start, $fmt ) + 12 * ONE_HOUR;
my $period_end = Time::Piece->strptime( $end, $fmt );
while (1) {
print $month_start->strftime($fmt), ' - ';
my $month_end = $month_start + ONE_DAY * ( $month_start->month_last_day - $month_start->mday );
# End of Cycle if current End of Month is greater than or equal to End Date
if ( $month_end > $period_end ) {
print $end, "\n";
last;
}
# Print End of Month and begin cycle for next month
print $month_end->strftime($fmt), "\n";
$month_start = $month_end + ONE_DAY;
}
输出:
2014-08-18 - 2014-08-31
2014-09-01 - 2014-09-30
2014-10-01 - 2014-10-17
答案 1 :(得分:0)
你没有说出你遇到了什么问题,所以我猜你要求一个算法来达到你想要的效果。
当我需要处理日期和时间时,我使用DateTime对象(通常由DateTime::Format::Strptime构造),但Date :: Calc也应该完成任务。我对Date :: Manip一无所知。