Не удается разрешить просчет високосных секунд в календаре

0

У меня есть календарь, который показывает мне неправильные дни с датой дня недели. Более конкретно, они на один день отстают от фактической даты.

Я провел кучу исследований и использовал следующий вопрос SO (дата php ('d') вычисляет тот же результат в течение двух последовательных дней), но я не могу заставить его работать над моим скриптом.

В настоящее время он показывает 26 октября два раза, оттуда в эти дни идут не так.

$firstday = mktime(0,0,0,$month,1,$year);
$day = date('Y-m-d',$firstday);
$fday = strtotime($day." last Sunday ",$firstday);
$currday_timestamp = mktime(0,0,0,date('m'),date('d'),date('Y'));

for($i=0;$i<7;$i++) {
            $firstweek[$i]['id'] = date("Y-m-d",$fday+(86400 * $i));
            $firstweek[$i]['val'] = date("d",$fday+(86400 * $i));
            if($currday_timestamp > $fday+(86400 * $i)) {
                $firstweek[$i]['flag'] = 1;    
            }
            $secondweek[$i]['id'] = date("Y-m-d",$fday+(86400 * ($i+7)));
            $secondweek[$i]['val'] = date("d",$fday+(86400 * ($i+7)));
            if($currday_timestamp > $fday+(86400 * ($i+7))) {
                $secondweek[$i]['flag'] = 1;    
            }
            $thirdweek[$i]['id'] = date("Y-m-d",$fday+(86400 * ($i+14)));
            $thirdweek[$i]['val'] = date("d",$fday+(86400 * ($i+14)));
            if($currday_timestamp > $fday+(86400 * ($i+14))) {
                $thirdweek[$i]['flag'] = 1;    
            }
            $fourthweek[$i]['id'] = date("Y-m-d",$fday+(86400 * ($i+21)));
            $fourthweek[$i]['val'] = date("d",$fday+(86400 * ($i+21)));
            if($currday_timestamp > $fday+(86400 * ($i+21))) {
                $fourthweek[$i]['flag'] = 1;    
            }
            $fifthweek[$i]['id'] = date("Y-m-d",$fday+(86400 * ($i+28)));
            $fifthweek[$i]['val'] = date("d",$fday+(86400 * ($i+28)));
            if($currday_timestamp > $fday+(86400 * ($i+28))) {
                $fifthweek[$i]['flag'] = 1;    
            }
            $sixthweek[$i]['id'] = date("Y-m-d",$fday+(86400 * ($i+35)));
            $sixthweek[$i]['val'] = date("d",$fday+(86400 * ($i+35)));
            if($currday_timestamp > $fday+(86400 * ($i+35))) {
                $sixthweek[$i]['flag'] = 1;    
            }
        }

Как я могу решить эту проблему с прыжком в секунду? Есть ли значение, которое нужно добавить к секундам?

  • 2
    Это неправильный способ делать математику. Когда вы работаете с буквальными секундами, вы сталкиваетесь со многими проблемами, и это одна из них, а летнее время - другая. Используйте DateTime () и DateInterval () для вычисления даты в PHP.
  • 0
    Я буду переделывать всю функцию в будущем, но пока я использовал ответ markt как быстрое решение. Спасибо за совет!
Теги:
date
mktime

1 ответ

0
Лучший ответ

Похоже, что это связано с изменением от летнего времени до стандартного времени.

Самый простой способ - добавить пару часов к базовому времени:

$time_offset = 2 * 60 * 60; // 2 hours
$firstday = mktime(0,0,0,$month,1,$year) + $time_offset;
$day = date('Y-m-d',$firstday);
$fday = strtotime($day." last Sunday ",$firstday) + $time_offset;
$currday_timestamp = mktime(0,0,0,date('m'),date('d'),date('Y')) + $time_offset;
  • 0
    Нет, самый простой способ - не делать математику, добавляя секунды.
  • 0
    Это исправило это для меня как быстрое решение. Я не знаю, есть ли какие-либо недостатки, связанные с этим решением, но я ценю быструю помощь. Я перестрою функцию, следуя совету Джона, в будущем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню