Date timezone - Встановити часовий пояс в PHP і MySQL. Dater - визначає часовий пояс, локалізує і форматує час в PHP Як встановити часовий пояс в php

Date timezone - Встановити часовий пояс в PHP і MySQL. Dater - визначає часовий пояс, локалізує і форматує час в PHP Як встановити часовий пояс в php

21 березня 2013 о 12:58

Dater - визначає часовий пояс, локалізує і форматує час в PHP

  • PHP

Коли при розробці веб-проекту постає завдання обліку часових поясів користувачів, то кожен раз рішення начебто доводиться винаходити заново. З безлічі відомих мені проектів вирішили це завдання я не пригадаю жодного рішення, яке можна було б назвати простим, прозорим для всієї архітектури і універсальним.

А що якщо хочеться просто кілька рядків коду, і щоб увесь інший код ніколи не дізнався, що дані клієнта потрібно віддавати в іншому часовому поясі, і що в даних прийшли від клієнта час може бути зазначено до часового поясу відмінним від серверного? Для вирішення цієї та багатьох інших завдань, сьогодні я розповім вам про одну лаконічну і функціональну бібліотеку для PHP.

І так, зустрічайте - Dater, і його основні можливості:

  • Біндінг форматів
  • Локалізація текстів і форматів
  • Розширення списку опцій форматування
  • Автоопределение часового поясу
  • Конвертація часу з урахуванням часового поясу
  • Автоматична конвертація часу в $ _GET, $ _POST, $ _REQUEST з урахуванням часового поясу
  • Автоматична конвертація часового поясу в шаблоні даних, що відправляються
Обіцяні рядки коду з автоматичного визначення і обробці користувальницького часового поясу залишимо на десерт, а поки стисло нагадаємо основні можливостям Dater, в кратце, на прикладах.

Біндінг форматів

Дозволяє стандартизувати для проекту набір використовуваних форматів і працювати з ними на ім'я:

$ Dater \u003d new Dater \\ Dater (new Dater \\ Locale \\ En ()); $ Dater-\u003e format (time (), "d / m / Y"); // 2013/03/14 $ dater-\u003e addFormat ( "slashedDate", "d / m / Y"); $ Dater-\u003e format (time (), "slashedDate"); // 2013/03/14 $ dater-\u003e slashedDate (time ()); // 2013/03/14

Розширення опцій форматування

Доступні всі опції форматування з date (), які також можуть бути перевизначені і розширені:

$ Dater-\u003e addFormatOption ( "ago", function (DateTime $ datetime) (return floor ((time () - $ datetime-\u003e getTimestamp ()) / 86400). "Days ago";)); $ Dater-\u003e format (time () - 60 * 60 * 24 * 7, "d F Y, ago"); // 14 March 2013, 7 days ago

підтримка локалей

$ Dater-\u003e setLocale (new Dater \\ Locale \\ En ()); echo $ dater-\u003e date (); // 03/21/2013 echo $ dater-\u003e now ( "j F Y"); // 21 March 2013 $ dater-\u003e setLocale (Dater \\ Dater :: getLocaleByCode ( "ru")); echo $ dater-\u003e date (); // 21.03.2013 echo $ dater-\u003e now ( "j F Y"); // 21 березня 2013

Стандартні методи для серверних і призначених для користувача форматів з урахуванням локалі

echo $ dater-\u003e date (); // 03/21/2013 (client timezone, depends on locale) echo $ dater-\u003e time (); // 5:41 AM (client timezone, depends on locale) echo $ dater-\u003e datetime (); // 03/21/2013 5:41 (client timezone, depends on locale) echo $ dater-\u003e isoDate (); // 2013-03-21 (client timezone) echo $ dater-\u003e isoTime (); // 5:41:28 (client timezone) echo $ dater-\u003e isoDatetime (); // 2013-03-21 5:41:28 (client timezone) echo $ dater-\u003e serverDate (); // 2013-03-21 (server timezone) echo $ dater-\u003e serverTime (); // 9:41:28 (server timezone) echo $ dater-\u003e serverDatetime (); // 2013-03-21 9:41:28 (server timezone)

Конвертація дати-часу з урахуванням часового поясу

$ Dater-\u003e setServerTimezone ( "Europe / Moscow"); $ Dater-\u003e setClientTimezone ( "Europe / London"); echo $ dater-\u003e serverDatetime (); // 2013-03-21 8:18:06 echo $ dater-\u003e isoDatetime (); // 2013-03-21 4:18:06 echo $ dater-\u003e time (); // 4:18
Варто згадати, що при виклику $ dater-\u003e setServerTimezone ( "Europe / Moscow"); функція date () і клас DateTime повертатимуть час в новому встановленому часовому поясі. Щоб це відключити передайте методу false другим параметром.

І нарешті обіцяне

Код, який дозволить вам автоматично визначити часовий пояс клієнта і виводити для нього актуальну дату-час:

У заголовку глобального скрипта ініціалізації

$ Dater \u003d new Dater \\ Dater (new Dater \\ Locale \\ Ru (), "Europe / Moscow"); $ TimezoneDetector \u003d new Dater \\ TimezoneDetector (); $ Dater-\u003e setClientTimezone ($ timezoneDetector-\u003e getClientTimezone ()); $ DataHandler \u003d new Dater \\ DataHandler ($ dater); $ DataHandler-\u003e enableOutputTimezoneHandler (); $ DataHandler-\u003e convertRequestDataToServerTimezone ();
В основному шаблоні

getHtmlJsCode ()?\u003e
Тепер все рядки 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 - забінденний в Dater формат. Також можна виводити і форматувати timestamp формат: 1363853607.

Наприклад, такі дані

Timestamp format: 1363238564 (не зміниться) Timestamp format: 1363238564 Timestamp format: 1363238564 Server datetime format: 2013-03-14 9:22:44 Server datetime format: 2013-03-14 9:22:44 Server datetime format: 2013- 03-14 9:22:44
Будуть автоматично конвертовані в

Timestamp format: 1363238564 (не зміниться) Timestamp format: 2013/03/14 Timestamp format: 14.03.2013 7:22 Server datetime format: 2013/03/14 Server datetime format: 7:22 Server datetime format: 2013-03-14 7:22:44

У той же час $ dataHandler-\u003e convertRequestDataToServerTimezone (); зробить так, що все YYYY-MM-DD HH: MM: SS дані надходять від клієнта будуть конвертовані в YYYY-MM-DD HH: MM: SS часового поясу сервера. Таким чином сервер ніколи не дізнається про те, що клієнт отримує і відправляє дату-час в іншому часовому поясі.

Варто визнати, що це трошки екстремальний варіант обробки часових поясів. Більш універсальним і традиційним рішенням було б відмовитися від використання $ dataHandler-\u003e enableOutputTimezoneHandler (); і просто обрамляти вставку кожної дати-часу викликом відповідного методу форматування. наприкладdate ($ datetimeOrTimestamp)?\u003e.

Про проект

Чесно зізнаюся, що є автором цієї бібліотеки, і буду дуже вдячний за будь-яку критику і допомогу в доопрацюванні. Вихідні тексти викладені на

Іноді виникає така ситуація, що поточний час на сервері не відповідає вашому часовому поясу або часовому поясу регіону, на який орієнтований ваш сайт.

Щоб було зрозуміло, нагадаю: територіально Росія дуже велика, і далеко не всім потрібно, щоб їх сайти «жили» за московським часом. Наприклад, Урал, Сибір, Далекий Схід і т.д.

Сервери більшості популярних російських хостинг-провайдерів розміщені на технологічних майданчиках Москви і Санкт-Петербурга і по-умолочанію налаштовані, природно, на московську тимчасову зону. Сервер не може автоматично підлаштовуватися під ваше поточне місце розташування і переводити системний годинник. У зв'язку з чим, робота функцій дати і часу на сайті може бути не зовсім коректною. Природно, зараз мова не йде про CMS, в яких поправка часового поясу зазвичай присутній прямо в інтерфейсі адміністратора.

В першу чергу перевірте поточний стан за допомогою PHP-коду:

echo ini_get ( "date.timezone");

Добре, якщо у вас свій сервер і є доступ до php.ini, де можна задати потрібну тимчасову зону і забути. Наприклад, таким чином:

Date.timezone \u003d Europe / Moscow

Правда, якщо на сервері розміщені кілька проектів, в яких повинні підтримуватися різні часові пояси, тоді краще цього не робити. У цьому випадку буде правильніше поставити тимчасові зони тільки для проектів, де один часовий пояс.

Установка часового поясу на віртуальному хостингу

На віртуальному хостингу, доступу до конфігам сервера найчастіше немає. Тому, в першу чергу спробуйте задати тимчасову зону за допомогою .htaccess. Просто знайдіть або створіть в корені свого сайту файл.htaccess і додайте в нього такий рядок:

Php_value date.timezone "Europe / Moscow"

Якщо спосіб не спрацює, тоді скористаємося функцією date_default_timezone_set (), яка встановлює тимчасову зону по-замовчуванню для всіх функцій дати і часу. Для цього потрібно десь на початку скрипта просто додайте такий рядок:

Date_default_timezone_set ( "Europe / Moscow");

природно, Europe / Moscow змінюється на необхідний вам часовий пояс. Для території РФ в PHP підтримуються наступні тимчасові зони:

  • Europe / Moscow
  • Europe / Samara
  • Europe / Kaliningrad
  • Europe / Volgograd
  • Asia / Anadyr
  • Asia / Kamchatka
  • Asia / Krasnoyarsk
  • Asia / Magadan
  • Asia / Novokuznetsk
  • Asia / Novosibirsk
  • Asia / Omsk
  • Asia / Sakhalin
  • Asia / Vladivostok
  • Asia / Yakutsk
  • Asia / Yekaterinburg

Зі списком усіх доступних тимчасових зон можна ознайомитися за посиланням або виконати команду, яка поверне вам список тимчасових зон, доступних на вашому сервері.

Print_r (DateTimeZone :: listIdentifiers ());

Іноді потрібно зробити такий сайт, на якому час буде підлаштовуватися під часовий пояс користувача. Завдання це непросте в тому плані, що визначити часовий пояс користувача проблемно. Тому виводять в 99% випадків час, відповідне серверного часовому поясу. Але давайте з Вами розберемо, як все-таки можна вивести час з урахуванням часового поясу конкретного користувача.

Як я вже написав, визначити часовий пояс користувача складно, про це ми поговоримо в наступній статті. А поки що будемо вважати, що ми вже знаємо тимчасове зміщення щодо серверного часу.

Найкраще буде поставити серверне час за Гринвічем. І зберігати треба все дані з часом саме за Гринвічем. Я вже колись писав, що зберігати треба в тій же базі даних нЕ строковий формат дати і часу, а числовий, Тобто той, який повертається функцією time ().

Давайте з Вами розберемо невеликий код:

date_default_timezone_set ( "UTC"); // Встановлюємо часовий пояс за Гринвічем
$ Time \u003d time (); // Ось це значення відправляємо в базу
$ Offset \u003d 3; // Припустимо, у користувача зміщення щодо Гринвіча становить +3 години
$ Time + \u003d 3 * 3600; // Додаємо 3 годину до часу за Гринвічем
echo date ( "Y-m-d H: i: s", $ time); // Виводимо час користувача, згідно з його часовому поясу
?>

Приблизно так і працює висновок часу з урахуванням часового поясу користувача на PHP. Безумовно, можна і не ставити за замовчуванням час за Гринвічем, а дізнаватися зміщення щодо серверного часу. Втім, про усунення ми з Вами поговоримо в наступній статті.

Якщо ви помітили, що час на вашому сайті не збігається з вашим часовим поясом і ви хотіли б його поправити, то для цього існує кілька способів. Більшість віртуальних хостингів забороняє редагування цього файлу, але не впадайте у відчай, досягти того ж результату можна внісши деякі зміни в файл.htaccess. У цьому посібнику ви дізнаєтеся, як змінити часовий пояс вашого сайту.

Перед тим, як ви почнете це керівництво, вам знадобиться наступне:

  • Доступ до панелі управління хостингом або FTP

Крок 1 - Пошук і редагування файла.htaccess

файл .htaccess знаходиться в каталозі public_html. Ви можете відкрити його за допомогою файлового Менеджера у вашій панелі управління хостингом або підключившись до вашого облікового запису через FTP-клієнт (наприклад, FileZilla). Дані керівництва детально розповідають про обох способах:

Крок 2 - Пошук правильного часового поясу

Список всіх підтримуваних часових поясів може бути знайдений на цьому сайті.

По-перше, виберіть свій регіон.

Тепер виберіть часовий пояс, який ви хочете використовувати. У нашому випадку, ми виберемо Europe / Moscow.

Крок 3 - Налаштування часового поясу через.htaccess

Після того, як ви дізнаєтеся формат вашого часового поясу, відкрийте файл .htaccess. Після цього, додайте наступний код в самий верх файлу .htaccess:

Php_value date.timezone "Europe / Moscow"

ВАЖЛИВО! Замість Europe / Moscow впишіть потрібний вам часовий пояс.

Вітаємо, ви успішно змінили часовий пояс вашого сайту!

висновок

Це коротке керівництво розповіло вам про те, як змінити часовий пояс на сайті через.htaccess. Тепер вам не потрібно турбуватися про неправильному часу на вашому сайті.

 

 

Це цікаво: