Як отримати налаштування часової зони WordPress?


50

Хтось може сказати мені, як отримати часовий пояс, встановлений у адміністраторі WordPress?

Наприклад, якщо для блогу встановлено східний час, мені потрібна ця точна рядок, щоб роздрукувати:

США / Схід

Це для функції, яка живе в мойвій темі function.php.

Відповіді:


79

якщо вам потрібен gmt_offset, тоді

<?php echo get_option('gmt_offset'); ?>

це дасть вам ціле число, як 2 або -2 .

і якщо вам потрібно використовувати рядок часового поясу

<?php echo get_option('timezone_string'); ?>

це дасть вам такий струн, як Америка / Індіанаполіс


6
Мій часовий пояс є в базі даних, але він порожній, навіть після вибору іншого часового поясу на сторінці налаштувань. Який може бути випадок? (WP3.6)
користувач2019515

Чи враховує gmt_offest економію денного світла на основі налаштувань часового поясу сайту?
squarecandy

6
@ user2019515 Якщо ви обрали місто як часовий пояс, воно збережеться у варіанті "timezone_string", але якщо ви виберете "Зручне зміщення вручну" (наприклад, +1 +), воно збережеться у варіанті "gmt_offset" (як "1") та timezone_string залишається порожнім.
Беренд

15

Прикри ситуація полягає в тому, що дійсно є два різні варіанти:

  1. Новіший timezone_string, що зберігає часовий пояс у стилі PHP.
  2. Старіші gmt_offset, що дозволяє економити зсув числового поплавця за години.

Але в нових середовищах timezone_stringфактично переосмислюється gmt_offset , значення, повернене останнім, буде базуватися на першому. Однак навпаки не вірно - воно gmt_offsetможе бути дійсним, поки timezone_stringвоно порожнє.

Я витрачаю досить багато часу на ці речі, і найсучасніший процес, який я впровадив у своїй WpDateTimeбібліотеці, полягає в наступному:

class WpDateTimeZone extends \DateTimeZone {
    /**
     * Determine time zone from WordPress options and return as object.
     *
     * @return static
     */
    public static function getWpTimezone() {
        $timezone_string = get_option( 'timezone_string' );
        if ( ! empty( $timezone_string ) ) {
            return new static( $timezone_string );
        }
        $offset  = get_option( 'gmt_offset' );
        $hours   = (int) $offset;
        $minutes = abs( ( $offset - (int) $offset ) * 60 );
        $offset  = sprintf( '%+03d:%02d', $hours, $minutes );
        return new static( $offset );
    }
}

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


1
Це має бути прийнятою відповіддю. Люди натрапляють на помилки, якщо вони покладаються виключно на get_option ('timezone_string').
DiscoInfiltrator

Це правильна відповідь.
Лукас Бустаманте

Хіба не використання (int)$ годин і floor$ хвилин проблематично? Згідно з документацією, (int)і floorмайже однакові, за винятком того, що (int)будуть круглі -4,5 до -4 і floorокругляться до -5. Це здається, що це призведе до неправильних відхилень часового поясу?
Mikepote

1
@Mikepote Так, це було зафіксовано в lib дуже давно, просто затхла копія коду у відповіді тут.
Рарст

О боже мій, чому вони реалізували це так ... Це коштувало мені повного годинного нахилу
Blackbam


2

Не думайте, що ви отримаєте рядок типу US / Eastern, не зберігаючи всі потрібні рядки в масиві та посилаючись на них. За допомогою PHP можна отримати абревіатуру часового поясу, тобто EST ; і якщо у вас є ці значення, збережені в масиві з потрібними рядками, ви можете їх шукати.

<?php date_default_timezone_set(get_option('timezone_string'));

      echo date('T'); // will give you three-character string like "EST"

      $timezones = array (
          'EST' => 'US/Eastern',
          'CST' => 'US/Central',
          // etc, etc, etc.
          );

      echo $timezones [ date('T') ]; // should be what you want.
 ?>

Це зайве. Стандарти часового поясу є частиною PHP з 5.2, як і об'єкт DateTimeZone та відповідні стандартні функції.
Хаз

1

Щоб додати до Bainternet (я додаю це як відповідь, оскільки не можу коментувати - у мене на стеку розвитку WP менше 50 балів).

WordPress буде зберігати рядок часового поясу, лише якщо ви вибрали рядок часового поясу в загальних параметрах. Вибір UTF у списку за замовчуванням, але ви можете прокручувати шлях до рядків часового поясу. Якщо встановити рядок часового поясу, буде встановлено і UTF, і рядок часової зони. Вони будуть однаковими (це означає, що UTF буде скинуто до нової зони при виборі часового поясу рядка часового поясу).

(WordPress 4)


0

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

Наступний код, я думаю, працює лише в тому випадку, якщо ви вибрали часовий пояс (у розділі Налаштування -> Загальне в адміністраторі) як назване місто замість зміщення номера GMT. Я не перевіряв цього, але дуже можливо, що get_option('gmt_offset')він встановлюється, коли get_option('timezone_string')його немає.

date_default_timezone_set(get_option('timezone_string'));

Мінус цього полягає в тому, що WordPress передбачає, що PHP встановлений на UTC під час створення часових міток mysql, тож ви можете трохи плутати вашу базу даних при кожному переключенні часових поясів! Не кажучи вже про інші плагіни WP, можна припустити, що середовище PHP завжди знаходиться в UTC.

Отже, якщо ви просто бажаєте правильного часу - ви можете змусити свою часову позначку бути в UTC за допомогою:

get_post_time('c', true); //should work for non-post objects.

На жаль, хоча це правильно, це змусить встановити часовий пояс на UTC.

І зауважте , що ви не можете одночасно використовувати «істинний» прапор і функцію в timezone_set по замовчуванням.

Будь-яке правильне рішення буде фрагментом коду, який обчислює gmt_offsetІ І, timezone_stringі використовує їх для встановлення часового поясу на деякий вхід. WP передбачає, що PHP встановлений на UTC, коли роблять часові позначки mysql, і він може порушити інші плагіни.

Є одне таке рішення на https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/, але, знову ж таки, це помилка, тому вам слід використовувати get_post_time($date_format, TRUE)код, щоб отримати позначку часу, яка насправді правильно.


0

Враховуючи той факт, що wordpress зберігає рядок часового поясу в таблиці параметрів, ви можете використовувати об'єктно-орієнтований спосіб отримання потрібного часу на вашому сайті wordpress:

$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);

$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.