php date('d')连续两天计算相同的输出

时间:2012-12-26 13:38:45

标签: php date mktime

我正在通过PHP构建一个日历,而我正在这样做的结果有些日子会被写两次。

我在这个小脚本中复制了这个行为:

<?php
//
// define a date to start from
//
$d = 26;
$m = 10;
$y = 2013;
date_default_timezone_set('CET');
$time = mktime(0, 0, 0, $m, $d, $y);

//
// calculate 10 years
//
for($i=0;$i<3650;$i++){ 
  $tomorrowTime = $time + (60 * 60 * 24);

  //
  // echo date if the next day has the same date('d') result
  //
  if(date('d',$time)==date('d',$tomorrowTime)){
    echo date('d-m-Y',$time)." was calculated twice... \n";
  }

  $time = $tomorrowTime;
}

?>

这就是我得到的:

27-10-2013 was calculated twice... 
26-10-2014 was calculated twice... 
25-10-2015 was calculated twice... 
30-10-2016 was calculated twice... 
29-10-2017 was calculated twice... 
28-10-2018 was calculated twice... 
27-10-2019 was calculated twice... 
25-10-2020 was calculated twice... 
31-10-2021 was calculated twice... 
30-10-2022 was calculated twice... 

当我将$time定义为0 (unix epoch)时,我的行为并不相同。 使用mktime()有什么问题吗? 或者11月只是尴尬?

干杯, Jeroen

3 个答案:

答案 0 :(得分:2)

有道理,这些是闰秒。并非所有日子都需要86400秒。

请勿使用12 AM进行这些计算,请使用12 PM。这会有很大的帮助。

也就是说,有更好的日期计算方法。但是你的12 PM数学运算适用于UTC时区(或CET)。

答案 1 :(得分:2)

这句话应该更好地防止闰秒等:

$tomorrowTime = strtotime('+1 days', $time);

答案 2 :(得分:1)

这就是为什么你不添加秒来计算时间。 DST和闰秒使得在一天内并不总是完全60 * 60 * 24秒。您可以使用mktime进行正确的计算:

for ($i = 0; $i < 3650; $i++) { 
    $time = mktime(0, 0, 0, $m, $d + $i, $y);
    //                          ^^^^^^^

    ...
}