Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php日期(';d';)计算连续两天的相同输出_Php_Date_Mktime - Fatal编程技术网

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

php日期(';d';)计算连续两天的相同输出,php,date,mktime,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++){

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

?>
当我将
$time
定义为
0(unix时代)
时,我没有得到相同的行为。 使用
mktime()
是否有问题? 还是十一月只是尴尬

干杯,
杰罗恩说得通,这是闰秒。并非所有的日子都需要86400秒

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


也就是说,有更好的方法来计算日期。但在UTC时区(或CET),下午12点的数学计算很好。

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

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


也就是说,有更好的方法来计算日期。但在UTC时区(或CET),下午12点的数学计算很好。

这就是为什么不加秒来计算时间的原因。DST和leap秒使其成为可能,因此一天中并不总是有精确的
60*60*24
秒。您可以使用
mktime
进行正确的计算:

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

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

这正是为什么不加秒来计算时间的原因。DST和leap秒使其成为可能,因此一天中并不总是有精确的
60*60*24
秒。您可以使用
mktime
进行正确的计算:

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

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

此语句应能更好地防止闰秒等:

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

此语句应更好地防止闰秒,例如:

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

对在发布这个问题之后,我注意到当我使用
$time=mktime(1,0,0,$m,$d,$y)时首次创建时,问题本身没有出现。非常感谢。对在发布这个问题之后,我注意到当我使用
$time=mktime(1,0,0,$m,$d,$y)时首次创建时,问题本身没有出现。非常感谢。谢谢你的解释!谢谢你的解释!非常感谢。我将此标记为解决方案,因为您友好地向我提供了优雅地解决此问题的代码。谢谢!我将此标记为解决方案,因为您友好地向我提供了优雅地解决此问题的代码。看起来更像是追溯日期而不是闰秒日期的夏时制时钟,更像是追溯日期而不是闰秒日期的夏时制时钟