Получение времени Windows в PHP

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

Использование time(), похоже, не работает, потому что оно знает часовой пояс и игнорирует, действительно ли DST включено или нет на сервере. Например, если часовой пояс установлен на «Америка/Лос-Анджелес», но летнее время не отмечено (машина Windows), если сегодняшняя дата, скажем, 1 сентября, тогда время Windows может быть 13:00, но PHP time() вернет 14:00.

Как я могу получить время Windows сервера? (используя PHP 5.2.14).

Воспроизведение проблемы

  • Установите часовой пояс «America/Los_Angeles» и снимите флажок «Daylight Savings Time». Установите дату 1 сентября 2010 г., 16:00:00.
  • Создайте простой PHP-скрипт со следующим, затем запустите его

echo date_default_timezone_get(), date("H:i:s", time());

Выход Америка/Лос-Анжелес 17:00:00. Обратите внимание на разницу в 1 час из-за перехода на летнее время.


person JRL    schedule 04.01.2011    source источник
comment
time() возвращает временную метку UNIX, не зависящую от часового пояса. Как вы определили, что он выключен на один час?   -  person deceze♦    schedule 05.01.2011
comment
Что говорит date_default_timezone_get()? Можете ли вы показать код? Как вы определили, что time() выключен?   -  person Pekka    schedule 05.01.2011
comment
date("r") уже должно указывать местное время в соответствии с системными настройками и часовым поясом, а gmdate("r") — это версия по Гринвичу. В противном случае это может быть php.ini проблема.   -  person mario    schedule 05.01.2011
comment
@deceze, @Pekka, @mario: см. мою правку.   -  person JRL    schedule 05.01.2011
comment
@JRL Я думаю, проблема в том, что PHP просто не слушает ваши локальные настройки летнего времени. Он использует официальную информацию о переходе на летнее время, встроенную в информацию о часовом поясе, в которой говорится, есть ли переход на летнее время и в какой период. Хотя не уверен, что с этим делать   -  person Pekka    schedule 05.01.2011
comment
@Pekka: именно так я и пришел к выводу. Мне нужно системное время. Может быть, используя системный вызов, например system(time) или что-то в этом роде? Можно ли это использовать надежно? Вот что я надеялся узнать.   -  person JRL    schedule 05.01.2011
comment
Системный вызов для получения времени был бы некрасивым. Я думаю, ответ Джо должен сработать   -  person Pekka    schedule 05.01.2011
comment
Возвращает ли time другую временную метку в зависимости от того, включено ли летнее время или нет? На мой взгляд, не должно. Кроме того, date('...', time()) является избыточным, это то же самое, что и date('...'). Это приводит к тому, что time, вероятно, не является виновником, а преобразование в удобочитаемый формат времени через date. Я не знаю, это просто придирки или это дает вам какую-то важную информацию. :)   -  person deceze♦    schedule 05.01.2011


Ответы (2)


Я думаю, что PHP не учитывает настройку Windows DST. Часовые пояса интерпретируются в соответствии с определенным стандартом. Также, согласно последнему разу, это произошло: Летнее время неверно даже после установки часового пояса

Но см. http://php.net/manual/en/function.date-default-timezone-set.php
Существует пример кода, использующего WShell для запроса в реестре Win фактических значений, включая флаг DST. Затем, используя timezone_abbreviations_list(), вы можете найти псевдоним с правильным именем часового пояса и флагом DST, установите его.

Также у @Pekka было другое обходное решение: php date( ) на час раньше серверного времени (проблема летнего времени) (он просто не всем говорит.)

person mario    schedule 05.01.2011

date("Z") дает вам локальное смещение со знаком от gmt в секундах. затем вы можете добавить это к выводу даты. см. справочную страницу функции даты

если вы не доверяете этим настройкам, вы также можете выполнить команду даты, используя shell_exec и проанализируйте вывод

person The Surrican    schedule 05.01.2011
comment
date(Z) дает смещение часового пояса, а это не то, что мне нужно, поскольку оно не учитывает, включено ли летнее время на сервере или нет. - person JRL; 05.01.2011
comment
Что касается синтаксического анализа вывода shell_exec, проблема заключается в том, что локаль может различаться, и поэтому сопоставитель для нее может быть сложным. - person JRL; 05.01.2011