计算两个日期之间的天数(不使用模块)

时间:2013-07-30 09:10:17

标签: perl date

我在这里搜索了很多,似乎所有解决方案都在使用某些模块或其他模块。

我有 yyyymmdd 格式的2个日期。我想知道一种简单的方法来计算这些日期之间的天数,没有使用任何模块。

实施例: 日期1:20130625 日期2:20130705

天数= 10

PS:由于服务器的限制,我不能使用任何模块我将运行脚本。 Perl版本 - 5.8.4

3 个答案:

答案 0 :(得分:6)

表达式返回10.

(
    Time::Piece->strptime('20130705', '%Y%m%d')
  - Time::Piece->strptime('20130625', '%Y%m%d')
)->days

Time::Piece是核心Perl发行版since v5.9.5的一部分。

答案 1 :(得分:4)

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;

    # make month in range 3..14 (treat Jan & Feb as months 13..14 of prev year)
    if ( $m <= 2 ) {
        $y -= ( $adj = ( 14 - $m ) / 12 );
        $m += 12 * $adj;
    }
    elsif ( $m > 14 ) {
        $y += ( $adj = ( $m - 3 ) / 12 );
        $m -= 12 * $adj;
    }

    # add: day of month, days of previous 0-11 month period that began w/March,
    # days of previous 0-399 year period that began w/March of a 400-multiple
    # year), days of any 400-year periods before that, and 306 days to adjust
    # from Mar 1, year 0-relative to Jan 1, year 1-relative (whew)

    $d += ( $m * 367 - 1094 ) / 12 + $y % 100 * 1461 / 4 + ( $y / 100 * 36524 + $y / 400 ) - 306;
}

print yyyymmdd_to_rata_die(20130705) - yyyymmdd_to_rata_die(20130625);

答案 2 :(得分:-1)

简单:

1)每个日期:

1.1)将岁月变成ydays

1.2)将月数变为mdays

1.3)总和天+ mdays + ydays

2)减去两个值