Очевидно, что прыжок в британское летнее время (летнее время) - большая путаница в мире программирования, и я действительно захвачен этим заблуждением.
Лучшее возможное решение, которое я могу найти (который я попытаюсь объяснить) при использовании чувствительной к часовому поясу системы, это:
- Веб-сервер и база данных должны работать в одном часовом поясе компьютера. Я предлагаю UTC, поскольку это строительные блоки преобразования часовых поясов. Это обеспечит постоянство всех дат, хранящихся в вашей базе данных, и не пропускает ни одного раза, например, переход на 1 час между переходами на летнее время.
- В верхней части всех ваших PHP-скриптов используйте
date_default_timezone_set('Europe/London');
с указанием часового пояса пользователя.
- При создании дат из отправленных пользователем форм используйте
gmmktime();
, чтобы убедиться, что созданная временная метка указана в формате UTC и не изменена установленным часовым поясом.
date();
можно использовать при отображении дат, поскольку это преобразует метку времени в правильное время с учетом установленного вами часового пояса.
- Если вам нужно показать дату в формате UTC, тогда используйте
gmdate();
с $gm_timestamp
, который вы взяли из базы данных или создали с помощью gmmktime();
.
Я написал этот кусочек PHP, чтобы помочь понять ситуацию.
date_default_timezone_set('UTC');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';
date_default_timezone_set('Europe/London');
$gmtime = gmmktime(2,0,0,03,29,2009);
$time = mktime(2,0,0,03,29,2009);
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />';
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />';
Надеюсь, я проделал хорошую работу, но я сомневаюсь в этом, потому что я все еще пытаюсь бороться с проблемой в моей голове.
UPDATE:
Рад, что я сделал это, потому что теперь у меня есть сомнения по поводу введенных пользователем дат.
Чтобы дата, введенная пользователем (с учетом их часового пояса), совпадала с соответствующей датой UTC в базе данных, вы должны указать ее через mktime()
. А затем используйте gmdate('U', $timestamp);
, чтобы получить истинную метку времени UTC. (Думаю)
* ** тысяча сорок один тысяча сорок-два ** 1 043 * Пример * ** 1046 тысячи сорок-пять *
Глядя на это с точки зрения отчетности, пользователь использует часовой пояс «Европа / Лондон». В начале нашего PHP-скрипта мы вызываем date_default_timezone_set('Europe/London');
, в то время как База данных (и все записи в ней) все еще находится в UTC.
Затем пользователь отправляет через него, что он хочет выбрать список книг, добавленных в базу данных в период с 25/03/2010 10:00 до 30/03/2010 14:00. Затем скрипт PHP запускает переменные даты через mktime($hour, $minute, $second, $month, $day, $year)
, чтобы сгенерировать правильную метку времени UTC. Дата начала не изменится, но PHP знает, что дата окончания находится в пределах часового пояса BST, поэтому соответственно изменяет метку времени на UTC.
Когда результаты возвращаются пользователю, date('r', $date_added)
может использоваться для отображения пользователю даты, когда книга была добавлена в базу данных в соответствии с установленным часовым поясом.
Эта ссылка может помочь понять, когда она изменится. http://www.daylightsavingtime.co.uk/