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


php date('d') calculates same output for two consecutive days

我正在通过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... 

当我定义$time0 (unix epoch)时,我没有得到相同的行为。使用mktime()有什么问题吗?还是说11月只是尴尬?

欢呼,珀斯

这个语句应该更好地防止闰秒,如:

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

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

这些计算不要用上午12点,用下午12点。那会很有帮助的。

也就是说,有更好的日期计算方法。但是你用12点计算的时间对于UTC时区(或CET)是可以的。

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

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