Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > date c параметром timestamp и без


Автор: flashaa 10.1.2008, 14:12
Недавно натолкнулся вот на что.
Получаю кое-какой таймстамп (для пример он будет равен 600 = 10 минут), затем вывожу его, вот так:
date('H-i-s', $timestamp);
И получаю 03-10-00, т.е. 3 часа откуда-то взялись. 
Это смещение от GMT, но вопрос вот в чем:
почему тогда date без timestamp-параметра cдвига GMT не происходит?
date('H-i-s') - выводит мое локальное время и не прибавляет 3 часа.
Путаница ведь какая-то.

Автор: SqueeZe 10.1.2008, 14:42
Используй функцию gmdate() - параметры те же, что и у date(), но время по Гринвичу.

Автор: MoLeX 10.1.2008, 14:48
Цитата

Замечание: В семействе ОС Microsoft Windows системные библиотеки, реализующие эту функцию, содержат ошибки, поэтому функция gmdate() на этих системах не поддерживает отрицательные значения аргумента timestamp. 

Автор: SqueeZe 10.1.2008, 16:06
Цитата(MoLeX @ 10.1.2008,  14:48)
Цитата

Замечание: В семействе ОС Microsoft Windows системные библиотеки, реализующие эту функцию, содержат ошибки, поэтому функция gmdate() на этих системах не поддерживает отрицательные значения аргумента timestamp. 

А когда используются отрицательные значения timestamp??? Никогда с таким не встречался.

Ага. Проверил такой код:
Код

<?
$timestamp = -600;
echo gmdate('H:i:s', $timestamp);
?>

Вывело "23:50:00", те получается, что он минусует от 24:00:00... интересно.

Между прочим, как я понимаю замечание у меня не сработало, те видимо этот баг уже устранен. 

Автор: MoLeX 10.1.2008, 16:13
SqueeZe не знаю), вот и привел отрывок из манула (не из головы выдумал я)

Автор: SelenIT 10.1.2008, 21:39
Цитата(flashaa @  10.1.2008,  14:12 Найти цитируемый пост)
Это смещение от GMT, но вопрос вот в чем:
почему тогда date без timestamp-параметра cдвига GMT не происходит?

Потому что таймстемп сам по себе по Гринвичу, а date всегда выводит локальное. В Вашем случае нулю часов десяти минутам по Гринвичу соответствуют 3:10. Только и всего. SqueeZe подсказал правильный выход smile.

Цитата(MoLeX @  10.1.2008,  14:48 Найти цитируемый пост)
функция gmdate() на этих системах не поддерживает отрицательные значения аргумента timestamp.

Это тут абсолютно ни при чем. Это касается дат до 1970 года.

Автор: flashaa 10.1.2008, 22:12
Насколько я понял локальный time() всегда формируется с учетом гринвича.
Т.е. если сервер расположен в московской зоне, то time() сгенерирует метку на 3 часа большую чем реальное текущее московское время )
А если выведем date('H:i'), то парсер преобразует текущее время с учетом сдвига по GMT, т.е. смотрит чему равен этот сдвиг и вычитает его... потому каждый, запуская date() у себя на локальной машине видит "свое" время, в какой часовой зоне он не находился. При этом численные значения меток timestamp, означающих одно и то же время но в разных часовых поясах, - разные.

Автор: SelenIT 11.1.2008, 00:34
Цитата(flashaa @  10.1.2008,  22:12 Найти цитируемый пост)
При этом численные значения меток timestamp, означающих одно и то же время но в разных часовых поясах, - разные.

Логично - по определению Unix timestamp-а, отсчет которого ведется именно с полуночи по Гринвичу. Хотя помню, как в свое время сам с этим намучился, так что назвать это "очевидным" не берусь smile.

Автор: flashaa 11.1.2008, 11:52
Да, для меня было не очень очевидно, что как при генерации, так и при парсинге timestamp сервер опирается на свою временную зону.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)