получить время 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всегда возвращает дату по Гринвичу. Синтаксис такой же, как у date.

nikc.org
источник
12
@sanmai: временная метка Unix по определению всегда является UTC. en.wikipedia.org/wiki/Unix_time
nikc.org
1
@ nikc.org: Проблема в том, что gmdate ("U") возвращает то же самое, что и time (), которое не является меткой времени UTC, если часовой пояс системы вашего сервера отличается. Единственный способ получить реальную временную метку на основе UTC - это strtotime (gmdate ("M d YH: i: s")), который отличается от gmdate ("U"), когда часовой пояс системы вашего сервера отличается от UTC
bksi
@bksi Я не могу повторить описанное вами поведение. (Моя машина не работает по Гринвичу, и мои временные метки UNIX верны. Также gmdate("U") == time().) Похоже на потенциально ошибочное поведение. Дважды проверьте и сообщите об ошибке в проекте PHP.
nikc.org
Я использовал простой скрипт php для проверки сценария: <? 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 - Возможно, вы путаете внутреннее представление datetime с внешним представлением datetime? время без спецификатора зоны против времени со спецификатором зоны? Как сказано в nikc (и в документации), time()возвращает «количество секунд с начала эпохи Unix (1 января 1970 г., 00:00:00 по Гринвичу)». Примечание GMT. Тот факт, что по умолчанию ваша система преобразует этот часовой пояс для отображения, удобен для пользователя. Внутри всегда время по Гринвичу.
ToolmakerSteve
90

Простой gmdate () будет достаточно

<?php
print gmdate("Y-m-d\TH:i:s\Z");
Шанкар Дамодаран
источник
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
Jessedc
источник
3
В документации DateTime __construct () больше не предлагается опускать первый параметр для получения текущего времени. Теперь он говорит, что вы должны использовать строку «сейчас».
PaulSkinner
Спасибо @PaulSkinner, я исправил ответ.
Jessedc
Спасибо, для чего раньше использовались обратные косые черты DateTime? Сам запускаю, вроде нормально работает и без них.
Snow
1
@Snow Если этот код вставлен в код с пространством имен, допустим, у вашего файла есть namespace Aобъявление вверху, PHP будет считать, DateTimeчто ссылается на него A\DateTime, что неверно. Добавление обратной косой черты устраняет проблему. На мой взгляд, это хорошая привычка, даже если вы еще не используете пространства имен.
Niavlys 02
35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
Судхир Бастакоти
источник
3
@AlainTiemblo не совсем; вам нужно вычесть смещение, чтобы оно работало
санмай
14

Получение даты в формате UTC

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

Получение метки времени в формате UTC

time();

Результат не будет отличаться даже date_default_timezone_setот вашего кода.

StefansArya
источник
@ زياد Спасибо за исправление, я изменил свой ответ
StefansArya
Я думал, что gmdate () возвращает GMT, а не UTC. «Идентично функции date (), за исключением того, что возвращаемое время - это время по Гринвичу (GMT)». Я что-то упускаю? Эти выходят эквивалентными?
Jordan
3
@Jordan На практике UTC и GMT представляют одно и то же время. stackoverflow.com/questions/48942916/…
martti
12

Помимо вызова, gmdateвы также можете поместить этот код перед остальной частью кода:

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

Это заставит остальные ваши звонки, связанные с датой / временем, использовать часовой пояс GMT / UTC.

анубхава
источник
Больше не в последних версиях PHP.
Хом Назид 08
1
@KhomNazid "UTC" в качестве параметра все еще действует. php.net/manual/en/…
Харикришна
6

Вы можете использовать функцию gmmktime без аргументов, чтобы получить текущую метку времени в формате UTC:

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

gmmktime будет работать только в том случае, если время вашего сервера использует UTC. Например, мой сервер настроен на США / Тихоокеанский регион. указанная выше функция отображает тихоокеанское время.

RicoRico
источник
gmmktime () устарел
Джонни
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

Однако для максимальной переносимости / взаимодействия я бы рекомендовал использовать формат даты ISO8601.c

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');
Dalip
источник
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)
        );
    }
realmag777
источник
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");
?>

Shivasagar
источник