#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
нет, но я точно не помню.)