Почему PHP date () добавляет +1 час в вычислениях diff? - PullRequest
2 голосов
/ 22 марта 2010

У меня такой сложный вопрос, я уже искал все связанные вопросы в Stackoverflow и не решил ни одной моей головоломки , хотя мне кажется, что я бегаю кругами, поэтому вот вопрос:

У меня есть этот код:

$val = (strtotime('2010-03-22 10:05:00')-strtotime('2010-03-22 09:00:00'))

Это возвращает правильно $ val = 3900 (3600 секунд = 1 час, 300 секунд = 5 минут)

Но при этом:

echo date("H:i",$val)."<br>";

возвращает 02: 05

даже делая это:

echo date("H:i",3900)."<br>";

возвращает 02:05 (просто чтобы быть наивно уверенным)

Делаем это:

echo date("H:i eTO",3900)."<br>";

возвращает

02:05 System/LocaltimeCET+0100

Что правильно, мой часовой пояс CET и + 1.

Что происходит? Date () корректирует часовой пояс по какой-то причине? Или я что-то не так делаю?

Ответы [ 4 ]

2 голосов
/ 22 марта 2010

Да, это корректировка часового пояса. Когда вы делаете

$val = (strtotime('2010-03-22 10:05:00')-strtotime('2010-03-22 09:00:00'))

, то, что хранится в $val, является отметкой времени для 01:05, 1 января 1970 UTC. См. статью Википедии о Unix Time .

Если вы работаете с разницей между двумя временными метками, я бы предложил использовать DateTime :: diff (требуется PHP 5.3).

2 голосов
/ 22 марта 2010

Это происходит потому, что использование date (,) возвращает эпоху (00:00:00 01 января 1970 г. UTC) + количество секунд в метке времени. Он локализуется в вашем часовом поясе, поэтому, если вы укажете временную метку 0, он вернется 01:00:00 01 января 1970 года по UTC + 1.

0 голосов
/ 22 марта 2010

Это на самом деле правильное поведение, потому что дата работает по местному времени, и вы находитесь в GMT +1. Вы даете ему временную метку (3900), которая составляет 01.01.1970 1:05, и она просто показывает 1, чтобы перевести ее в ваш часовой пояс.

Если вы используете его по назначению, вы можете просто вычесть смещение GMT ​​вашего компьютера, чтобы получить правильное значение.

0 голосов
/ 22 марта 2010

Я сделал это:

date_default_timezone_set('Europe/Helsinki');

Что такое GMT ​​+ 02: 00

и результат был:

03:05 Europe/HelsinkiEET+0200

Итак, это действительно поправка на часовой пояс, объяснение, которое я нашел, было довольно простым (у меня было прозрение): date () считает секунды ОТ "1 января 1970 по Гринвичу" , так что фактически 3900 в мой часовой пояс и пример правильно "02:05" с этой даты ...

Самостоятельная работа +1 -_- '

...