如何获得perl范围之间的开始/结束日期的哈希值,其中开始日期和结束日期不是月份的开始/结束日期?

时间:2014-10-07 21:27:48

标签: perl date hash

我想要做的是,给定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,

);

2 个答案:

答案 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)

你没有说出你遇到了什么问题,所以我猜你要求一个算法来达到你想要的效果。

  1. 将$ current_date设置为$ start_date。
  2. 循环:
    1. 将$ end_of_month设置为$ current_date的月份的最后一天。
    2. 如果$ end_date小于或等于$ end_of_month,
      1. 将哈希的元素$ current_date设置为$ end_date。
      2. 退出循环。
    3. 将哈希的元素$ current_date设置为$ end_of_month。
    4. 将$ current_date设置为$ end_of_month。
    5. 在$ current_date中添加一天。
  3. 当我需要处理日期和时间时,我使用DateTime对象(通常由DateTime::Format::Strptime构造),但Date :: Calc也应该完成任务。我对Date :: Manip一无所知。