我正在通过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
答案 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);
// ^^^^^^^
...
}