Дата PHP () з часовим поясом?


79

Тож я перевірив список підтримуваних часових поясів у PHP, і мені було цікаво, як я можу їх включити у date()функцію? Дякую!

Я не хочу часовий пояс за замовчуванням, кожен користувач зберігає свій часовий пояс у базі даних, я беру цей часовий пояс користувача та використовую його. Як? Однак я знаю, як взяти його з бази даних, а не як ним користуватися.


В якому форматі ви зберігаєте часові пояси?
revo

Відповіді:


136

Для такого завдання ви дійсно повинні використовувати клас DateTime PHP. Будь ласка, ігноруйте всі відповіді, які радять вам використовувати date () або date_set_time_zone, це просто погано та застаріло.

Я буду використовувати псевдокод для демонстрації, тому спробуйте налаштувати код відповідно до ваших потреб.

Якщо припустити, що змінна $ tz містить ім'я рядка дійсного часового поясу, а змінна $ timestamp містить мітку часу, яку ви хочете відформатувати відповідно до часового поясу, код буде виглядати так:

$tz = 'Europe/London';
$timestamp = time();
$dt = new DateTime("now", new DateTimeZone($tz)); //first argument "must" be a string
$dt->setTimestamp($timestamp); //adjust the object to correct timestamp
echo $dt->format('d.m.Y, H:i:s');

Клас DateTime є потужним, і, щоб зрозуміти всі його можливості - вам слід приділити частину свого часу, читаючи про це на php.net. Щоб повністю відповісти на ваше запитання - так, ви можете динамічно налаштовувати параметр часового поясу (на кожній ітерації під час читання з db ви можете створити новий об’єкт DateTimeZone ()).


1
@ Glavić - ти маєш рацію, я залишу відповідь, щоб показати, як цього не робити. Однак DateTime перемагає маніпулювання часовим поясом сервера, саме на це я хотів (але не зміг) зазначити.
NB

ваш код не працює, оскільки першим параметром конструктора DateTime повинен бути рядок [ php.net/manual/en/datetime.construct.php ]
Олексій

@Alex - Так, це неправильно - саме це я прокоментував і залишив відповідь. Я відредагую відповідь, включивши правильний конструктор, коли я не полінуюсь :) (тим часом ви можете відредагувати відповідь теж?)
NB

Чому ви встановлюєте мітку часу на позначку часу зараз, оскільки ви вже ініціювали DateTime за допомогою "зараз"?
Джордж Димитріадіс,

@GeorgeDimitriadis, тому що це приклад того, як використовувати код. Це служить для того, щоб підкреслити, що ви можете зробити. Ви правильно сказали, що в даному випадку це в основному безглуздо , але я помістив його там, щоб люди бачили, як мітка часу може бути змінена на створеному DateTimeоб'єкті.
NB

38

Якщо я правильно зрозумів, спочатку потрібно встановити часовий пояс, наприклад:

date_default_timezone_set('UTC');

І чим ви можете використовувати функцію дати:

// Prints something like: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');

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

3
@ user2917204 Якщо ви використовуєте MySQL, зберігайте як TIMESTAMPтип даних. Вони зберігаються у UTC на сервері, щоб їх можна було перетворити в будь-який вибраний вами часовий пояс.
ceejayoz

Я використовую MySQL, і я зберігаю його як TIMESTAMP, який код мені потрібен для його перетворення?
user2917204

1
@ user2917204 Створіть функцію, яка встановлює часовий пояс, випльовує відформатовану дату та повертає часовий пояс назад. Багато прикладів stackoverflow.com/questions/11900126/… , stackoverflow.com/questions/7824038/… . Клас DateTime також приймає параметр часового поясу php.net/manual/en/class.datetime.php
Mike B

18

Натомість використовуйте клас DateTime , оскільки він підтримує часові пояси. Еквівалент DateTime date()є DateTime::format.

Надзвичайно корисною обгорткою для DateTime є Carbon - неодмінно подивіться на неї.

Ви захочете зберегти в базі даних як UTC і конвертувати на рівні програми.


Так, може. Ви впораєтесь із цим у своїй логіці програми, використовуючи setTimezone()функції цих класів.
ceejayoz

13

Відповідь вище змусив мене стрибати через обручі / підводні камені, так що просто розмістивши чистий код , який працював для мене:

$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('America/New_York'));
$dt->setTimestamp(123456789);

echo $dt->format('F j, Y @ G:i');

8

Це повинно сподобатися так:

date_default_timezone_set('America/New_York');

3
Я не хочу часовий пояс за замовчуванням, кожен користувач зберігає свій часовий пояс у базі даних, я беру цей часовий пояс користувача та використовую його. Як? Однак я знаю, як взяти його з бази даних, а не як ним користуватися.
user2917204

Він не створює часовий пояс за замовчуванням для всіх користувачів, лише поточний скрипт, який, мабуть, відповідає на дії 1 поточного користувача.
LStarky


2

Спробуйте це. Ви можете передати або мітку часу unix, або рядок дати та часу

public static function convertToTimezone($timestamp, $fromTimezone, $toTimezone, $format='Y-m-d H:i:s') 
    {
        $datetime = is_numeric($timestamp) ?
                    DateTime::createFromFormat ('U' , $timestamp, new DateTimeZone($fromTimezone)) :
                    new DateTime($timestamp, new DateTimeZone($fromTimezone));

        $datetime->setTimezone(new DateTimeZone($toTimezone));

        return $datetime->format($format);
    }

2

Ви можете просто додати різницю часових поясів до мітки часу Unix. Приклад для Москви (UTC + 3)

echo date('d.m.Y H:i:s', time() + 3 * 60 * 60);

1

Я створив цю дуже просту функцію, і вона працює як шарм:

function ts2time($timestamp,$timezone){ /* input: 1518404518,America/Los_Angeles */            
        $date = new DateTime(date("d F Y H:i:s",$timestamp));
        $date->setTimezone(new DateTimeZone($timezone));
        $rt=$date->format('M d, Y h:i:s a'); /* output: Feb 11, 2018 7:01:58 pm */
        return $rt;
    }

0

Не згадано вище. Ви також можете створити об'єкт DateTime, надавши мітку часу як рядок у конструкторі із провідним знаком @.

$dt = new DateTime('@123456789');
$dt->setTimezone(new DateTimeZone('America/New_York'));
echo $dt->format('F j, Y - G:i');

Дивіться документацію про складені формати: https://www.php.net/manual/en/datetime.formats.compound.php


-2

Ви можете замінити значення бази даних у функції date_default_timezone_set, date_default_timezone_set (SOME_PHP_VARIABLE); але потрібно лише подбати про точні значення, відповідні часовим поясам.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.