проблемы времени () и даты () после изменения времени (DST - стандарт) - PullRequest
4 голосов
/ 11 мая 2011

В PHP я хотел бы вывести список опций HTML, содержащий даты на следующие 14 дней.

Эти встречи всегда в 18 часов:

$today_day = date('d');
$today_month = date('m');
$today_year = date('Y');
$date_entry = mktime(18, 00, 00, $today_month, $today_day, $today_year);
$optionsStr = '<select name="date">';
for ($d = 1; $d < 14; $d++) {
    $date_entry_temp = $date_entry+86400*$d;
    $optionsStr .= '<option value="'.$date_entry_temp.'">'.date('d.m.Y', $date_entry_temp).'</option>';
}
$optionsStr .= '</select>';
echo $optionsStr;

Пользователь можетзатем выберите одну из этих дат и отправьте форму.Выбранная временная метка затем вставляется в базу данных.

Итак, у меня есть некоторые записи в моей базе данных.

На другой странице есть список текущих встреч:

mysql_query("SELECT id, name FROM appointments WHERE date_time = ".time());

Таким образом, в 18 часов должен быть какой-то вывод, так как в базе данных есть записи на этот день.Это работает очень хорошо, пока время не изменится с летнего времени на стандартное или наоборотТогда, действительно, это неправильно:

Встречи показываются на час позже или слишком рано соответственно.

Как я могу решить эту проблему?

Ответы [ 4 ]

5 голосов
/ 13 мая 2011

mktime () создает метку времени Unix.Штамп времени Unix - это количество секунд с 1 января 1970 года, 00:00:00 по Гринвичу +0000.(Гринвичское время)

Когда вы устанавливаете часовой пояс "Европа / Берлин", часовой пояс будет GMT + 0100 (зимой) или GMT + 0200 (летом).Это означает, что время ваших встреч по Гринвичу меняется на один час при наличии летнего времени.Это означает, что время между первым назначением до изменения и следующим назначением после изменения составляет не 24 часа, а 23 или 25. Однако вы генерируете встречи, добавляя 86400 секунд = 24 часа.

Вывместо этого можно использовать объект DateTime и метод add ().Принимает во внимание изменения летнего времени.

// create a new date object with todays date
$date = new DateTime();
// set the time to 18:00
$date->setTime(18,0,0);
$optionsStr = '<select name="date">';
for ($i = 0; $i < 14; $i++) {
    // add 1 day
    $date->add(new DateInterval('P1D'));
    $optionsStr .= '<option value="'.$date->format('U').'">'.$date->format('d.m.Y').'</option>';
}
$optionsStr .= '</select>';
echo $optionsStr;

См. http://www.php.net/manual/en/datetime.add.php для получения дополнительной информации.

4 голосов
/ 15 мая 2011

Ваша главная проблема в том, что вы не работаете с датами GMT. Вот красочный пост, в котором освещаются возникающие подводные камни:

http://derickrethans.nl/storing-date-time-in-database.html

То, что вам следует делать, это сохранять даты встреч в часовом поясе UTC, сравнивать даты в часовом поясе UTC и отображать даты для пользователей в вашем (хорошо) или их (идеальном) предпочтительном часовом поясе.

0 голосов
/ 11 мая 2011

Кажется, у вас проблема с часовыми поясами: http://dev.mysql.com/doc/refman/5.0/en/timestamp.html Я бы выбрал выбранное время, перевел из вашего местного времени в UTC и затем поместил бы его в базу данных. Если вы прочитали его, вернитесь из UTC в местное время.

0 голосов
/ 11 мая 2011

Если вы полагаетесь на время, пожалуйста, убедитесь, что вы всегда устанавливаете TIMEZONE, либо в своем php.ini, либо в своем коде.И вы ничего не можете сделать с записями в своей базе данных, если вы отсортируете их по времени или дате, в результате они будут чередоваться из-за того, что новая дата предшествует дате вашей последней записи перед изменением времени.

...