Как я могу учесть переход на летнее время при получении текущего времени в PHP?

При получении времени с помощью сценария PHP (time()) во время перехода на летнее время кажется, что возвращается значение времени с отклонением в один час. Есть ли способ узнать точное время с учетом летнего времени?


person TerranRich    schedule 18.08.2011    source источник
comment
Вы можете получить настройку часового пояса PHP с помощью date('e') и / или date_default_timezone_get().   -  person Marc B    schedule 18.08.2011


Ответы (5)


time() возвращает временную метку Unix, а временная метка Unix - это фиксированный период времени: количество секунд с начала эпохи Unix. На него не влияют часовые пояса.

Как только у вас будет точный момент, вы можете рассчитать местное время в данном месте:

<?php

$now = time();
echo $now . PHP_EOL;

date_default_timezone_set('Europe/Madrid');
echo date('r', $now) . PHP_EOL;

date_default_timezone_set('Asia/Tokyo');
echo date('r', $now) . PHP_EOL;

... будет печатать разные местные даты для одной и той же метки времени:

1313683738
Thu, 18 Aug 2011 18:08:58 +0200
Fri, 19 Aug 2011 01:08:58 +0900

То же самое относится и к противоположной операции:

<?php

date_default_timezone_set('Europe/Madrid');
$then = mktime(23, 55, 30, 12, 31, 2000);
echo $then . PHP_EOL;

date_default_timezone_set('Asia/Tokyo');
$then = mktime(23, 55, 30, 12, 31, 2000);
echo $then . PHP_EOL;

... напечатает разные временные метки:

978303330
978274530
person Álvaro González    schedule 18.08.2011

time () получает время ОС в формате Unix Timestamp. Вы можете исправить это с помощью PHP, но, по-моему, это нужно исправить на уровне ОС.

person ddinchev    schedule 18.08.2011

Либо убедитесь, что системное время текущее, либо добавьте / вычтите в PHP: http://www.php.net/manual/en/function.date.php#69221

person Matt Stein    schedule 18.08.2011
comment
Хочу добавить, что функция даты имеет специальный флаг для перехода на летнее время. - person Jrod; 18.08.2011

Установите правильный часовой пояс с помощью date_default_timezone_set()

person Mchl    schedule 18.08.2011
comment
Или установите часовой пояс через php.ini в PHP ‹5 - person feeela; 18.08.2011

Это не будет «правильный» ответ, но ваш провайдер может неправильно управлять временем локального сервера. Я не знаю, в каком контексте вы используете информацию о времени, но всякий раз, когда я использую такую ​​информацию, я пытаюсь использовать UTD / GMT. Если ваши пользователи разбросаны по всему миру или даже в одной стране, исправление ситуации может стать кошмаром. Представление таких вещей, как время сохранения файла, время журнала или другое использование, можно разумно выполнить с помощью UDT / GMT.

person Daniel Werner    schedule 18.08.2011
comment
Какое время UTD / GMT или UDT / GMT? Может вы имеете в виду время UTC / GMT или что-то еще? - person Kar.ma; 10.04.2017