- date_default_timezone_set
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes
- Как вывести время с учётом часового пояса в PHP
- Комментарии ( 5 ):
- Dater — определяет часовой пояс, локализует и форматирует время в PHP
- Биндинг форматов
- Расширение опций форматирования
- Поддержка локалей
- Стандартные методы для серверных и пользовательских форматов с учётом локали
- Конвертация даты-времени с учётом часового пояса
- И наконец обещанное
- О проекте
date_default_timezone_set
date_default_timezone_set() устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте.
Вместо использования этой функции, вы можете воспользоваться INI-настройкой date.timezone для установки часового пояса по умолчанию.
Список параметров
Идентификатор часового пояса, например, UTC , Africa/Lagos , Asia/Hong_Kong или Europe/Lisbon . Список допустимых идентификаторов часовых поясов можно найти в разделе Список поддерживаемых часовых поясов.
Возвращаемые значения
Функция возвращает false , если timezoneId имеет неверное значение, в остальных случаях true .
Примеры
Пример #1 Получение часового пояса по умолчанию
if ( strcmp ( $script_tz , ini_get ( ‘date.timezone’ ))) echo ‘Часовой пояс скрипта отличается от заданного в INI-файле.’ ;
> else echo ‘Часовой пояс скрипта и настройки INI-файла совпадают.’ ;
>
?>
Смотрите также
- date_default_timezone_get() — Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте
- Список поддерживаемых часовых поясов
User Contributed Notes
- Функции даты и времени
- checkdate
- date_add
- date_create_from_format
- date_create_immutable_from_format
- date_create_immutable
- date_create
- date_date_set
- date_default_timezone_get
- date_default_timezone_set
- date_diff
- date_format
- date_get_last_errors
- date_interval_create_from_date_string
- date_interval_format
- date_isodate_set
- date_modify
- date_offset_get
- date_parse_from_format
- date_parse
- date_sub
- date_sun_info
- date_sunrise
- date_sunset
- date_time_set
- date_timestamp_get
- date_timestamp_set
- date_timezone_get
- date_timezone_set
- date
- getdate
- gettimeofday
- gmdate
- gmmktime
- gmstrftime
- idate
- localtime
- microtime
- mktime
- strftime
- strptime
- strtotime
- time
- timezone_abbreviations_list
- timezone_identifiers_list
- timezone_location_get
- timezone_name_from_abbr
- timezone_name_get
- timezone_offset_get
- timezone_open
- timezone_transitions_get
- timezone_version_get
Как вывести время с учётом часового пояса в PHP
Иногда требуется сделать такой сайт, на котором время будет подстраиваться под часовой пояс пользователя. Задача эта непростая в том плане, что определить часовой пояс пользователя проблемно. Поэтому выводят в 99% случаев время, соответствующее серверному часовому поясу. Но давайте с Вами разберём, как всё-таки можно вывести время с учётом временной зоны конкретного пользователя.
Как я уже написал, определить часовой пояс пользователя сложно, об этом мы поговорим в следующей статье. А пока что будем считать, что мы уже знаем временное смещение относительно серверного времени.
Лучше всего будет поставить серверное время по Гринвичу. И сохранять надо все данные со временем именно по Гринвичу. Я уже когда-то писал, что хранить надо в той же базе данных не строковый формат даты и времени, а числовой, то есть тот, который возвращается функцией time().
Давайте с Вами разберём небольшой код:
date_default_timezone_set(«UTC»); // Устанавливаем часовой пояс по Гринвичу
$time = time(); // Вот это значение отправляем в базу
$offset = 3; // Допустим, у пользователя смещение относительно Гринвича составляет +3 часа
$time += 3 * 3600; // Добавляем 3 часа к времени по Гринвичу
echo date(«Y-m-d H:i:s», $time); // Выводим время пользователя, согласно его часовому поясу
?>Примерно так и работает вывод времени с учётом часового пояса пользователя на PHP. Безусловно, можно и не ставить по умолчанию время по Гринвичу, а узнавать смещение относительно серверного времени. Впрочем, о смещении мы с Вами поговорим в следующей статье.
Создано 01.03.2013 11:05:23
- Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 5 ):
получается, что когда у нас переводится время +-1час летом и зимой, то придется два раза в год вручную менять значение $offset . я правильно понял?
если таким скриптом,то да.можно функцию смены написать по дате
а можно немного поподробнее? 🙂 можно эту ф-ию в студию? а то я уже больше месяца не могу до конца разобраться с этими ф-иями даты и времени.
к сожалению в студию нельзя — её надо писать) суть я объяснил) условием проверяете дату и,если совпадает с нужной — переводите время
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.
Dater — определяет часовой пояс, локализует и форматирует время в PHP
Когда при разработке веб-проекта встаёт задача учёта часовых поясов пользователей, то каждый раз решение как будто приходится изобретать заново. Из множества известных мне проектов решивших эту задачу я не припомню ни одного решения, которое можно было бы назвать простым, прозрачным для всей архитектуры и универсальным.
А что если хочется просто несколько строчек кода, и чтобы весь остальной код никогда не узнал, что данные клиенту нужно отдавать в другом часовом поясе, и что в данных пришедших от клиента время может быть указано с часовым поясом отличным от серверного? Для решения этой и многих других задач, сегодня я расскажу вам про одну лаконичную и функциональную библиотеку для PHP.
И так, встречайте — Dater, и его основные возможности:
- Биндинг форматов
- Локализация текстов и форматов
- Расширение списка опций форматирования
- Автоопределение часового пояса
- Конвертация времени с учётом часового пояса
- Автоматическая конвертация времени в $_GET, $_POST, $_REQUEST с учётом часового пояса
- Автоматическая конвертация часового пояса в шаблоне отправляемых данных
Биндинг форматов
Позволяет стандартизовать для проекта набор используемых форматов и работать с ними по имени:
$dater = new Dater\Dater(new Dater\Locale\En()); $dater->format(time(), 'd/m/Y'); // 2013/03/14 $dater->addFormat('slashedDate', 'd/m/Y'); $dater->format(time(), 'slashedDate'); // 2013/03/14 $dater->slashedDate(time()); // 2013/03/14
Расширение опций форматирования
Доступны все опции форматирования из date(), которые также могут быть переопределены и расширены:
$dater->addFormatOption('ago', function (DateTime $datetime) < return floor((time() - $datetime->getTimestamp()) / 86400) . ' days ago'; >); $dater->format(time() - 60*60*24*7, 'd F Y, ago'); // 14 March 2013, 7 days ago
Поддержка локалей
$dater->setLocale(new Dater\Locale\En()); echo $dater->date(); // 03/21/2013 echo $dater->now('j F Y'); // 21 March 2013 $dater->setLocale(Dater\Dater::getLocaleByCode('ru')); echo $dater->date(); // 21.03.2013 echo $dater->now('j F Y'); // 21 марта 2013
Стандартные методы для серверных и пользовательских форматов с учётом локали
echo $dater->date(); // 03/21/2013 (client timezone, depends on locale) echo $dater->time(); // 5:41 AM (client timezone, depends on locale) echo $dater->datetime(); // 03/21/2013 5:41 (client timezone, depends on locale) echo $dater->isoDate(); // 2013-03-21 (client timezone) echo $dater->isoTime(); // 05:41:28 (client timezone) echo $dater->isoDatetime(); // 2013-03-21 05:41:28 (client timezone) echo $dater->serverDate(); // 2013-03-21 (server timezone) echo $dater->serverTime(); // 09:41:28 (server timezone) echo $dater->serverDatetime(); // 2013-03-21 09:41:28 (server timezone)
Конвертация даты-времени с учётом часового пояса
$dater->setServerTimezone('Europe/Moscow'); $dater->setClientTimezone('Europe/London'); echo $dater->serverDatetime(); // 2013-03-21 08:18:06 echo $dater->isoDatetime(); // 2013-03-21 04:18:06 echo $dater->time(); // 04:18
Стоит упомянуть, что при вызове $dater->setServerTimezone(‘Europe/Moscow’); функция date() и класс DateTime будут возвращать время в новом установленном часовом поясе. Чтобы это отключить передайте методу false вторым параметром.
И наконец обещанное
Код, который позволит вам автоматически определить часовой пояс клиента и выводить для него актуальную дату-время:
В заголовке глобального скрипта инициализации
$dater = new Dater\Dater(new Dater\Locale\Ru(), 'Europe/Moscow'); $timezoneDetector = new Dater\TimezoneDetector(); $dater->setClientTimezone($timezoneDetector->getClientTimezone()); $dataHandler = new Dater\DataHandler($dater); $dataHandler->enableOutputTimezoneHandler(); $dataHandler->convertRequestDataToServerTimezone();
Теперь все строки YYYY-MM-DD HH:MM:SS в отправляемых данных будут заменены на YYYY-MM-DD HH:MM:SS в автоматически определённом часовом поясе клиента. Если же вам нужно выводить дату-время в определённом формате, то достаточно добавить YYYY-MM-DD HH:MM:SS[Н m d] или YYYY-MM-DD HH:MM:SS[date] где date — забинденный в Dater формат. Также можно выводить и форматировать timestamp формат: 1363853607[d.m.Y].
Например, следующие данные
Timestamp format: 1363238564 (не изменится) Timestamp format: 1363238564[Y/m/d] Timestamp format: 1363238564[datetime] Server datetime format: 2013-03-14 09:22:44[Y/m/d] Server datetime format: 2013-03-14 09:22:44[time] Server datetime format: 2013-03-14 09:22:44
Будут автоматически конвертированы в
Timestamp format: 1363238564 (не изменится) Timestamp format: 2013/03/14 Timestamp format: 14.03.2013 07:22 Server datetime format: 2013/03/14 Server datetime format: 07:22 Server datetime format: 2013-03-14 07:22:44
В то же время $dataHandler->convertRequestDataToServerTimezone(); сделает так, что все YYYY-MM-DD HH:MM:SS данные поступающие от клиента будут конвертированы в YYYY-MM-DD HH:MM:SS часового пояса сервера. Таким образом сервер никогда не узнает о том, что клиент получает и отправляет дату-время в другом часовом поясе.
Стоит признать, что это немножко экстремальный вариант обработки часовых поясов. Более универсальным и традиционным решением было бы отказаться от использования $dataHandler->enableOutputTimezoneHandler(); и просто обрамлять вставку каждой даты-времени вызовом соответствующего метода форматирования. Например date($datetimeOrTimestamp) ?> .
О проекте
Честно признаюсь, что являюсь автором этой библиотеки, и буду очень благодарен за любую критику и помощь в доработке. Исходники выложены на GitHub под свободной BSD лицензией, пользуйтесь и распространяйте как пожелаете.
Надеюсь кому-нибудь таки пригодится 🙂
UPD По многочисленным просьбам библиотека была зарефакторена с использованием namespace, в соответствии с PSR-0. Предыдущая версия сохранена в отдельный бранч, и доступна из Composer как «dater/dater»:»1.*@dev» .