2010-04-10 2 views
4

У меня проблема с функцией bizzare с функцией php date.date() возвращает неправильный день, хотя временная метка верна!

код:

$numDays = 8; 
$date = strtotime('2010-11-06'); 
for ($i=1; $i<=$numDays; $i++) 
{ 
    $thisDay = date("D, d M Y", $date); 
    print ($thisDay.'<br>'); 
    $date+=86400; // add one day to timestamp 
} 

результат на моем сервере (локальный хост, окна):

Сб, 6 ноября 2010

Вс, 7 ноября 2010

Пн, 8 ноября 2010

Вт, 09 Ноя 2010

Ср, 10 ноября 2010

чт, 11 ноября 2010

Пт, 12 ноября 2010

Сб, 13 ноября 2010

Результат на моем веб-сервере (Linux)

Сб, 06 Ноя 2010

* вс, 07 ноя 2010

Вс, 07 ноября 2010 *

Пн, 8 ноября 2010

Вт, 9 ноября 2010

Ср, 10 ноября 2010

чт, 11 ноября 2010

Пт, 12 ноября 2010 г.

Обратите внимание, как Sun, 07 ноября 2010 года появляется дважды на удаленном сервере? Почему это происходит? может ли кто-нибудь объяснить это Поведение?

+6

86400 секунд = 1 день. Нужно много раз учиться этому, к сожалению, для каждого из краевых случаев: переход на летнее время, високосный год, прыжок-секунда, пересечение часового пояса, перемещение вблизи скорости света ... – Boldewyn

+0

+1 для скорости движения света, напоминает мне принципы относительности Эйнштейна !! –

+0

Буквально 86400 secods = 24 часа = один день :) Вопросы, связанные с часовым поясом - это другое дело! Приветствую мою вторую родину :) – mspir

ответ

8

7 ноября 2010 г. дата переключения DST во многих часовых поясах (но не в Греции, где вы, похоже, находитесь). От Wikipedia:

Начиная с 2007 года, большинство из Соединенных Штатов и Канады наблюдать DST со второго воскресенья марта по первое воскресенье ноября, почти две трети года.

В Греции, похоже, October 31. Какой часовой пояс у вас установлен на вашем компьютере?

+0

Вы правы, если я установил часовой пояс в Афинах (Европа/Афины), даты будут указаны правильно. Однако это означает, что если пользователь находится в США или Канаде, вышеуказанный код не будет работать! если я использую US/Pacific как часовой пояс, например, я получаю неправильные результаты. Есть ли простой способ решить эту проблему? – mspir

+0

@spiros Я * думаю * 'strtotime (« + 1 день »);' будет принимать DST. –

+0

Если вы извлекаете данные с сервера базы данных, вам может быть лучше делать манипуляции с датами там; Postgres, в частности, здесь хорошо. Хранилища временных меток с часовым поясом могут быть просто перенесены в другой часовой пояс, и база данных обрабатывает все дневные сбережения и т. Д. (Я не думаю, что скорость света, упомянутая выше, учитывается, однако) - дополнительная информация по адресу http: // www.postgresql.org/docs/8.3/static/datatype-datetime.html#DATATYPE-TIMEZONES. Функции даты MySQL имеют тенденцию быть, по моему опыту, относительно хреном, но у кого-то еще может быть больше информации. –

2

Здесь трудно быть уверенным, но может возникнуть проблема с переходным периодом перехода на летнее время в часовой пояс удаленного сервера?

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

+0

Полезно как подсказка, чтобы установить часовой пояс, но Пекка был более подробным и подробным, поэтому я принял его. Спасибо :) – mspir

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10155302) – Nasreddine

+0

@Nasreddine Как бы вы посоветовали мне улучшить этот ответ? Я мог бы отредактировать его, чтобы предоставить полное решение проблемы автора, так как теперь мы знаем, что вызвало его. – Mihai

1

Запустите свой код с начальной датой +1 час, а затем -1hr и посмотрите, какие результаты вы получите.Вы получите больше подсказок, и, скорее всего, это связано с летним временем.

Также, как указал Пекка, попробуйте то же самое с датой, установленной 31 октября, и посмотрите, что произойдет.

Хороший вопрос.

1

Это хорошая практика, чтобы сделать расчеты времени в формате UTC, а затем преобразовать их в нужных временные зоны для местоположения пользователя с использованием функций даты-времени ПГПСА:

date_default_timezone_set('UTC'); 
$timezone = new DateTimeZone('Europe/Athens'); 
$datetime = new DateTime('now', $timezone); 
echo $datetime->format('Y-m-d H:i:s'); 
Смежные вопросы