Почему strtotime дает разные результаты в разных часовых поясах? - PullRequest
4 голосов
/ 03 сентября 2011

Я не уверен, почему strtotime() в PHP возвращает разные результаты в разных часовых поясах, даже если в качестве параметра указана одна и та же дата, кто-нибудь знает ответ?Я также хочу знать, могу ли я выполнить аналогичную задачу (преобразовать datetime в int для облегчения расчетов) с другой функцией, которая дает одинаковый результат в разных часовых поясах?

РЕДАКТИРОВАТЬ:

Пример: если я использую strtotime('2011-09-19 00:00:00'), не должно ли он просто вернуть разницу между 'January 1 1970 00:00:00' и '2011-09-19 00:00:00' в секундах?Почему часовой пояс является проблемой здесь?И могу ли я получить что-то, что дает просто разницу без проблем с часовым поясом?

Ответы [ 6 ]

7 голосов
/ 05 сентября 2011

Вкратце: часовой пояс считается потому, что значение GMT ​​Unpoch учитывается в GMT.

В более широком смысле 2011-09-19 00:00:00 приходит в Бангладеш почти через 6 часов, это 2011-09-19 00:00:00 в зоне GMT. Из-за этого разрыва прошло еще 21600 секунд в зоне GMT, когда такая же дата появляется в BD.

Поскольку вычисление выполняется относительно времени по Гринвичу, вы должны добавить эти 21600 секунд, чтобы получить фактическую разницу.

6 голосов
/ 03 сентября 2011

strtotime дает разные результаты в разных часовых поясах, потому что учитывает часовые пояса ...

Из руководства strtotime :

Функция ожидает получить строку, содержащую формат даты на английском языке, и попытается проанализировать этот формат в метку времени Unix (количество секунд с 1 января 1970 г. 00:00:00 UTC)

Эта функция будет использовать переменную окружения TZ (если она доступна) для вычисления метки времени. Начиная с PHP 5.1.0, существуют более простые способы определения часового пояса, который используется во всех функциях даты и времени. Этот процесс объясняется на функциональной странице date_default_timezone_get().

Взгляните на mktime().

Начиная с PHP 5.1, вы можете использовать date_default_timezone_set перед вызовом mktime или strtotime.

1 голос
/ 03 сентября 2011

С PHP документы на strtotime:

Эта функция будет использовать переменную окружения TZ (если доступна) для вычисления метки времени.Начиная с PHP 5.1.0, существуют более простые способы определения часового пояса, который используется во всех функциях даты и времени.Этот процесс объясняется на странице функции date_default_timezone_get ().

Попробуйте установить собственный часовой пояс .

1 голос
/ 03 сентября 2011

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

http://www.php.net/manual/en/function.date-default-timezone-set.php

1 голос
/ 03 сентября 2011

Из руководства по PHP:

Эта функция будет использовать переменную окружения TZ (если она доступна) для вычисления метки времени. Начиная с PHP 5.1.0, существуют более простые способы определения часового пояса, который используется во всех функциях даты и времени. Этот процесс объясняется на странице функции date_default_timezone_get ().

http://php.net/manual/en/function.strtotime.php

0 голосов
/ 29 июня 2012

Я думаю, вероятно, будет один раз, когда каждый php-программист заставит его задуматься о том, как на самом деле php работает с функциями даты и времени.

забавно эта функция, когда вы пытаетесь что-то вроде ... например ... предположим, что сегодня в этот самый момент 11 июля 2012 года в 13:00:00 (2012-07-11 13:00:00), а затем вы пытаетесь в strtotime найти точно такой же момент дня, но на завтра:

$x = strtotime('2012-07-12 13:00:00');

$y = strtotime('+1 Day');

$z = $x-$y;

$ x и $ y из указанных выше двух первых строк не вернут одно и то же, даже выигнорируйте значения минут и секунд, но $ z будет около 25200 или около 7 часов в разнице между этими двумя строками, если ваш сервер находится где-то в США, где время по Гринвичу составляет -5 часов, но летом браузер вызывает эту функцию из Берлинагде GMT ​​+2 часа ... LOL теперь вы можете понять, как php работает с этой функцией;)

...