読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

2つの日付の差を求めるの閏年におけるバグ(解決)

php

追記(2012/01/08)
こんなものはバグでも何でもなく、例えば
2012-01-08と、2012-01-08を比較したら、0が返ってきます。
これと同じ容量で、
2012-01-01と2012-01-31の差分の結果は、30です。そりゃあそうか。
というわけで、

<?php
echo get_diff_day('2011-01-01', '2012-01-01');
echo get_diff_day('2012-01-01', '2013-01-01');

の結果は365、366です。




2つの日付の差を求める - by shigemk2

いつぞやにこんな感じの関数を紹介したと思うんですが…

<?php
function substrDate($date, &$year, &$month, &$day) {
  // 一応引数チェックをここでやる
  $match = '/^\d{4}\-\d{2}\-\d{2}\s+\d{2}\:\d{2}\:\d{2}|^\d{4}\-\d{2}\-\d{2}/';
  if(!preg_match($match, $date)) {
    return;
  }
  $year = substr($date, 0, 4);
  if(substr($date, 5, 1) == 0) {
    $month = substr($date, 6, 1);
  } else {
    $month = substr($date, 5, 2);
  }
  if(substr($date, 8, 1) == 0) {
    $day = substr($date, 9, 1);
  } else {
    $day = substr($date, 8, 2);
  }
}

// 日数比較関数の改良版('YYYY-MM-DD' もしくは 'YYYY-MM-DD HH:II:SS')
function get_diff_day($date1, $date2) {
  substrDate($date1, $year1, $month1, $day1);
  substrDate($date2, $year2, $month2, $day2);
  $date1time = mktime(0, 0, 0, $month1, $day1, $year1);
  $date2time = mktime(0, 0, 0, $month2, $day2, $year2);
  $diff_day =  ($date2time - $date1time)/(60*60*24);
  return $diff_day;
}

$days = get_diff_day('2012-01-01', '2012-12-31');
echo $days;

とても鬱陶しいのですが、上記$daysの結果は閏年だから

366

と出る筈ですが、

365

と出ます。

なんでかなあ。

<?php
// $days = compareDate('2012-02-01', '2012-03-01');
// echo $days;

とやると

29

が返ってくるんです。

<?php
// $days = compareDate('2012-02-01', '2012-03-01');
// echo $days . "\n";
// $days = compareDate('2012-02-01', '2012-03-02');
// echo $days;

29
30

と出るのに。原因が分かりません。