отримати час UTC в PHP


122

Як я можу отримати позначку UTC / GMT +/- час за допомогою функції PHP date ()? Наприклад, якщо я спробую

date("Y-m-d H:i:s", time()); 

Я отримаю часовий штамп Unix; але мені потрібно отримати відмітку часу UTC / GMT з рядком GMT / UTC +/- 0400 або GMT / UTC +/- 1000 на основі місцевих таймінгів.


1
@JeffPuckettII GMT не змінюється для економії літнього часу. Великобританія влітку змінюється з GMT на BST, але GMT ​​залишається такою ж і завжди відповідає UTC.
lewis

Відповіді:


111

Використання gmdateзавжди повертає дату GMT. Синтаксис такий же, як і для date.


12
@sanmai: часова марка Unix за визначенням завжди є UTC. en.wikipedia.org/wiki/Unix_time
nikc.org

1
@ nikc.org: Проблема полягає в тому, що gmdate ("U") повертається так само, як час (), який не є часовою позначкою UTC, якщо часовий пояс вашої серверної системи інший. Єдиний спосіб, коли мені вдалося отримати реальну часову позначку на основі UTC, був strtotime (gmdate ("M d YH: i: s")), що відрізняється від gmdate ("U"), коли часовий пояс вашої серверної системи відрізняється від UTC
bksi

@bksi Я не можу повторити описану вами поведінку. (Моя машина не є GMT, і мої часові позначки UNIX є правильними. Також gmdate("U") == time().) Звучить як поведінка з потенційною помилкою. Перевірте і подайте помилку проекту PHP.
nikc.org

Я використовував простий скрипт для тестування сценарію: <? echo time (). "===" .strtotime (gmdate ("M d YH: i: s")). "Timezone:" .date ("Z"). "\ n"; ?> Коли я запускав його, я отримую такий результат: 1456342082 === 1456338482 Часовий пояс: 3600 Результатом дати команди оболонки є: ср 24 лютого 20:28:11 CET 2016
bksi

1
@bksi - Можливо, ви плутаєте внутрішнє представлення дати та зовнішнє представлення дати? час без / специфікатор зони проти часу із специфікатором зони? Як говориться nikc (і документація), time()повертається "кількість секунд з часів Unix Epoch (1 січня 1970 00:00:00 GMT)". Примітка GMT. Те, що ваша система за замовчуванням перетворює це у ваш часовий пояс для відображення, є зручністю для користувача. Всередині його завжди GMT.
ToolmakerSteve


47

Як було сказано раніше , оскільки PHP 5.2.0 ви можете використовувати DateTimeклас та вказати часовий пояс UTC з екземпляромDateTimeZone .

Документація DateTime __construct () пропонує передати "зараз" як перший параметр під час створення екземпляра DateTime та вказати часовий пояс для отримання поточного часу.

$date_utc = new \DateTime("now", new \DateTimeZone("UTC"));

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC

3
Документація DateTime __construct () більше не пропонує пропустити перший параметр для отримання поточного часу. Тепер написано, що ви повинні використовувати рядок "зараз".
PaulSkinner

Дякую @PaulSkinner, я змінив відповідь.
Джесседк

Спасибі, які цілі зворотних нахилів раніше DateTime? Сам запускаючи, здається, що без них це працює чудово.
Сніг

1
@Snow Якщо цей код вставлено в простір коду, скажімо, у вашому файлі namespace Aдекларація вгорі, PHP вважатиме, DateTimeщо посилається A\DateTime, що неправильно. Додавання зворотної косої риски вирішує проблему. На мою думку, це добре використовувати навіть якщо ви ще не використовуєте простори імен.
Niavlys



14

Отримання дати UTC

gmdate("Y-m-d H:i:s");

Отримання часової позначки UTC

time();

Результат не відрізнятиметься навіть date_default_timezone_setвід вашого коду.


@ زياد Дякую за виправлення, я змінив свою відповідь
StefansArya

Я думав, що gmdate () повертає GMT, а не UTC. "Ідентична функції date (), за винятком того, що повернутий час - середній час Грінвіч (GMT)". Я щось пропускаю? Вони виходять еквівалентними?
Йорданія

3
@Jordan На практиці UTC і GMT представляють один і той же час. stackoverflow.com/questions/48942916 / ...
Мартті

12

Крім виклику, gmdateви також можете поставити цей код перед вашим рештою коду:

<?php
date_default_timezone_set("UTC");
?>

Це дозволить залишити ваші дзвінки, пов’язані з датою / часом, щоб використовувати часовий пояс GMT / UTC.


Більше не в останніх версіях PHP.
Хом Назід

1
@KhomNazid "UTC" як параметр все ще діє. php.net/manual/en / ...
Харікрішна

6

Ви можете використовувати функцію gmmktime без аргументів для отримання поточної позначки часу UTC:

$time = gmmktime();
echo date("Y-m-d H:i:s", $time); 

gmmktime працюватиме лише тоді, коли ваш час на сервері використовує UTC. Наприклад, для мого сервера встановлено значення US / Pacific. перерахована вище функція перегукується з тихоокеанським часом.


gmmktime () застаріло
Jonny

2

з рядком GMT / UTC +/- 0400 або GMT / UTC +/- 1000 на основі локальних таймінгів

Ваш власний формат просто відсутній, Oщоб отримати зрушення часового поясу від місцевого часу.

Різниця від Грінвічського часу (GMT) у годинах Приклад: +0200

date_default_timezone_set('America/La_Paz');
echo date('Y-m-d H:i:s O');

2018-01-12 12:10:11 -0400

Однак для максимальної переносимості / сумісності я рекомендую використовувати формат дати ISO8601c

date_default_timezone_set('America/La_Paz');
echo date('c');

2018-01-12T12: 10: 11-04: 00

date_default_timezone_set('Australia/Brisbane');
echo date('c');

2018-01-13T02: 10: 11 + 10: 00

Ви також можете використовувати, gmdateі рядок зміщення часового поясу завжди буде+00:00

date_default_timezone_set('America/La_Paz');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

date_default_timezone_set('Australia/Brisbane');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00


1

Ви можете використовувати наступне, щоб отримати час UTC:

date_default_timezone_set('Asia/Calcutta');

$current_date = date("Y/m/d g:i A");

$ist_date = DateTime::createFromFormat(
                        '"Y/m/d g:i A"',
                        $current_date,
                        new DateTimeZone('Asia/Calcutta')
                    );

$utc_date = clone $ist_date;
$utc_date->setTimeZone(new DateTimeZone('UTC'));

echo 'UTC:  ' . $utc_date->format('Y-m-d g:i A');

0
/**
     * Converts a local Unix timestamp to GMT
     *
     * @param   int Unix timestamp
     * @return  int
     */
    function local_to_gmt($time = '')
    {
        if ($time === '')
        {
            $time = time();
        }

        return mktime(
            gmdate('G', $time),
            gmdate('i', $time),
            gmdate('s', $time),
            gmdate('n', $time),
            gmdate('j', $time),
            gmdate('Y', $time)
        );
    }

0

Нижче знайдіть код PHP, щоб отримати поточний UTC (універсальний координований час) час

<?php
// Prints the day
echo gmdate("l") . "<br>";

// Prints the day, date, month, year, time, AM or PM
echo gmdate("l jS \of F Y h:i:s A");
?>

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