Вычисления PHP со временем () и проблема с переходом на летнее время

#php #time #dst

#php #время #переход на летнее время

Вопрос:

Я использую скрипт, который вставляет дату (гггг-мм-дд), которая на X дней позже текущей даты. Я добавляю X секунд к первой временной метке, чтобы получить вторую, в 12:00.

Часовой пояс сервера — UTC -5, и я также установил его в своих сценариях с

 date_default_timezone_set('America/Montreal');
  

Мы переведем часы на один час назад 6 ноября, и любые математические вычисления с помощью time (), похоже, будут затронуты.
(Когда осенью заканчивается переход на летнее время, часы переводятся на час назад и стандартное время возобновляется.)
В 2:00 будет 1:00 6 ноября.


Например, временная метка даты 1: 1320379200 (пятница, 4 ноября 2011 года, 12:00:00, ДО изменения времени)
Я хочу добавить 7 дней к этой дате… 1320379200 (7 * 24 * 60 * 60)

Временная метка новой даты теперь равна 1320984000 (четверг, 10 ноября 2011 года, 11:00:00 вечера, ПОСЛЕ изменения времени)
, но она должна быть 1320987600 (пятница, 11 ноября 2011 года, 12:00:00 утра)
Я пропускаю 3600 секунд, поэтому один час.


Итак, чтобы было понятно (псевдокод):

 $timestampOfStartingDate = 1320379200   
echo timestampToDate($timestampOfStartingDate) // show 2011-11-04 (Friday 4th November 2011 12:00:00 AM)

$newTimestampAfter7days = $timestampOfStartingDate   (7 * 24 * 60 * 60)  
echo timestampToDate($newTimestampAfter7days)  // show 2011-11-10 instead of 2011-11-11 (Thursday 10th November 2011 11:00:00 PM instead of Friday 11th November 2011 12:00:00 AM)
  

Итак, мне не хватает одного часа, что, вероятно, связано с переходом на летнее время.


Дело в том, что я не знаю, как это исправить. Я не хочу повторять это, когда мы снова перейдем на летнее время.

Я надеюсь, вы, ребята, понимаете, о чем я говорю, поскольку я немного запутался. Также, пожалуйста, извините за мой английский, я делаю все возможное!

Ответ №1:

Вы должны добавлять 7 дней, а не x количество секунд.

 strtotime(" 7 days", $timestampOfStartinDate);
  

В качестве альтернативы используйте класс DateTime PHP.

Комментарии:

1. Собираюсь попробовать это прямо сейчас, я приму ответ, если это сработает. Если да, я буду считать себя довольно глупым, ха-ха. Спасибо за быстрый ответ.

2. @Kev, совсем не глупо! Я сам столкнулся с точно такой же проблемой. Подумайте об этом так… не все дни имеют длину 24 часа. Действительно, лучший способ — использовать UTC 0 на серверной части и отображать только для других часовых поясов для пользователя.

3. это работает!! Большое спасибо, я не могу принять ваш ответ прямо сейчас, так как мне нужно подождать несколько минут (потому что, ну, вы были слишком быстры, ха-ха). Я должен был начать с UTC 0 и изменить его только на дисплее, как вы говорите. Но теперь у меня есть временная метка, хранящаяся в UTC -5, иногда с включенным, иногда выключенным переходом на летнее время, в зависимости от того, когда временная метка была сохранена в базе данных. Мне действительно интересно, как я мог бы обновить все это, чтобы сделать их все UTC 0 ..!!

4. @Kev, простой UPDATE запрос к вашей базе данных может исправить это, если все они неизменно неверны. MySQL фактически хранит данные в UTC 0, в зависимости от типа. (Я думаю, что TIMESTAMP столбец делает это, а не DATETIME нет, но я точно не помню.)