PHP конвертировать дату и время в UTC - PullRequest
81 голосов
/ 19 января 2010

Мне нужен простой способ конвертировать метку даты в UTC (из любого часового пояса, на котором находится сервер) НАДЕЖДУ, без использования каких-либо библиотек.

Ответы [ 16 ]

99 голосов
/ 19 января 2010

Используйте strtotime , чтобы сгенерировать метку времени из заданной строки (интерпретируемой как местное время), и используйте gmdate , чтобы получить ее в виде отформатированной даты UTC.

Пример

По запросу, вот простой пример:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
58 голосов
/ 12 декабря 2014

Использование DateTime:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
27 голосов
/ 19 января 2010

Попробуйте getTimezone и setTimezone , см. Пример

(но для этого используется класс)

ОБНОВЛЕНИЕ:

Без каких-либо классов выможно попробовать что-то вроде этого:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

ПРИМЕЧАНИЕ. Возможно, вам также потребуется установить часовой пояс на исходный

19 голосов
/ 03 июля 2011

Сделайте так:

gmdate('Y-m-d H:i:s', $timestamp)

или просто

gmdate('Y-m-d H:i:s')

чтобы получить «СЕЙЧАС» в UTC.

Проверьте ссылку:

http://www.php.net/manual/en/function.gmdate.php

13 голосов
/ 15 февраля 2010

Если у вас есть дата в этом формате ГГГГ-ММ-ЧЧ, дд: мм: сс, на самом деле вы можете обмануть php, добавив UTC в конце вашей «строки времени-даты» и используйте strtotime для ее преобразования.

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";

Это напечатает это:

2009-01-01 13:00:00
2009-06-01 14:00:00

И, как вы можете видеть, он также решает проблему перехода на летнее время.

Немного странный способ решить это ....:)

5 голосов
/ 04 мая 2016

Преобразование строки местного часового пояса в строку UTC.
например Часовой пояс Новой Зеландии

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
  • NZDT: UTC + 13: 00
    if $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01";
    if $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00
    if $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01";
    if $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";

https://en.wikipedia.org/wiki/Time_in_New_Zealand

4 голосов
/ 18 августа 2012

Поскольку strtotime требует определенного формата ввода, DateTime :: createFromFormat может использоваться ( php 5.3+ требуется )

// set timezone to user timezone
date_default_timezone_set($str_user_timezone);

// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);

// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');

// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));

// return timezone to server default
date_default_timezone_set($str_server_timezone);
4 голосов
/ 16 апреля 2012

Я иногда использую этот метод:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

Работы все МОСТ того времени.

2 голосов
/ 17 декабря 2018

Если вы не возражаете против использования класса PHP DateTime , который доступен с PHP 5.2.0, то есть несколько сценариев, которые могут соответствовать вашей ситуации:

  1. Если у вас есть объект $givenDt DateTime, который вы хотите преобразовать в UTC, тогда он преобразует его в UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Если вам понадобится исходный $givenDt позже, вы можете альтернативно клонировать данный объект DateTime перед преобразованием клонированного объекта:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. Если у вас есть только строка даты и времени, например, $givenStr = '2018-12-17 10:47:12', затем вы сначала создаете объект datetime, а затем конвертируете его. Обратите внимание, что предполагается, что $givenStr находится в настроенном часовом поясе PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. Если заданная строка даты и времени находится в некотором часовом поясе, отличном от того, который указан в вашей конфигурации PHP, то создайте объект даты и времени, указав правильный часовой пояс (см. Список часовых поясов, которые PHP поддерживает ). В этом примере мы предполагаем местный часовой пояс в Амстердаме:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
1 голос
/ 09 ноября 2018

Выполните следующие шаги, чтобы получить время UTC из любой часовой пояс , установленный в локальной системе пользователя (это потребуется для веб-приложений для сохранения различных часовых поясов в UTC):

  1. Javascript (на стороне клиента):

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
    
  2. Php (на стороне сервера):

    public function convert_utc_time($date)
    {
        $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
        if($time_difference != ''){
            $time = strtotime($date);
            $time = $time + ($time_difference*60); //minutes * 60 seconds
            $date = date("Y-m-d H:i:s", $time);
        } //on failure of js, default timezone is set as UTC below
        return $date;
    }
    ..
    ..
    //in my function
    $timezone = 'UTC';
    $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
    echo strtotime($date. ' '. $timezone)
    
...