date () возвращает неправильный день, хотя временная метка верна!

У меня проблема с функцией bizzare с функцией php date.

код:

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

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

Сб, 06 ноя 2010

Вс, 07 Ноя 2010

Пн, 08 ноя 2010

Вт, 09 ноя 2010

Ср, 10 ноя 2010

Чт, 11 ноября 2010

Пт, 12 ноября 2010

Сб, 13 ноября 2010

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

Сб, 06 ноя 2010

* Вс, 07 ноя 2010

Вс, 07 Ноя 2010 *

Пн, 08 ноя 2010

Вт, 09 ноя 2010

Ср, 10 ноя 2010

Чт, 11 ноября 2010

Пт, 12 ноября 2010

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

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

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

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

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

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

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

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

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

Хорошая практика делать расчеты времени в формате UTC, а затем преобразовывать их в требуемый часовой пояс для местоположения пользователя с использованием функций datetime PHP:

 date_default_timezone_set('UTC'); $timezone = new DateTimeZone('Europe/Athens'); $datetime = new DateTime('now', $timezone); echo $datetime->format('Ymd H:i:s');