我正在通过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月只是尴尬?
欢呼,珀斯
这个语句应该更好地防止闰秒,如:
$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);
// ^^^^^^^
...
}