我搜索了很多,似乎所有解决方案都在使用某个模块或其他模块。
我有 2 个yyyymmdd格式的日期。我想知道一种简单的方法来计算这些日期之间的天数,而不使用任何模块。
示例:日期 1:20130625 日期 2:20130705
天数 = 10
PS:由于我将在其上运行脚本的服务器的限制,我无法使用任何模块。Perl 版本 - 5.8.4
表达式返回 10。
(
Time::Piece->strptime('20130705', '%Y%m%d')
- Time::Piece->strptime('20130625', '%Y%m%d')
)->days
Time::Piece是自 v5.9.5 以来的核心 Perl 发行版的一部分。
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);
这很简单:
1) 对于每个日期:
1.1) 把年变成 ydays
1.2) 把月变成 mdays
1.3) 计算天数 + mdays + ydays
2)减去两个值