php конвертувати дату і час у UTC


90

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

Відповіді:


30

Спробуйте 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 />");

ПРИМІТКА. Можливо, вам доведеться також встановити часовий пояс до початкового


55
Вам слід просто використовувати gmdateзамість того, щоб змінювати часовий пояс за замовчуванням на UTC. Тому що gmdateавтоматично використовує UTC.
тикати

29
-1, оскільки ви не хочете змінювати глобальний часовий пояс за замовчуванням для цього. Він просто вимагає небажаних побічних ефектів.
Уорд Беккер,

@Phill Що тут "sz"?
Шахід Карімі

2
Я думаю, це має бути "Ym-dTG ..." замість "Yd-mTG ..."
Алекс Анджеліко,

Це не працює для мене в проекті laravel. Його повернення тієї ж дати
Дхармендер Тулі,

109

Використовуйте strtotime, щоб згенерувати мітку часу з даного рядка (інтерпретується як місцевий час), а за допомогою gmdate отримати її як відформатовану дату UTC.

Приклад

За запитом, ось простий приклад:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));

7
Невеликий приклад, можливо?
cherouvim

2
@cherouvim Не думаю, що це потрібно, але все одно додав ... Сподіваюся, це допоможе.
тикати

5
gmdate () - одна з тих PHP-функцій, про які я хотів би вже давно натрапив. nl2br, хто-небудь?
Чарлі Шліссер,

1
GMT та UTC не завжди однакові.
Jay Sheth,

1
@poke GMT поважає перехід на літній час, UTC - ні, тому він використовується, тому вам не потрібно враховувати що-небудь інше
Necro

72

Використання 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

Питання говорить про перетворення позначки часу в позначку часу, а DateTime не приймає позначку часу як вхідну. Вам доведеться якось перетворити його в рядок, а потім перетворити назад.
felwithe


14

Якщо у вас є дата у такому форматі РРРР-ММ-ЧЧ дд: мм: сс, ви насправді можете обдурити 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

І як ви бачите, він також опікується проблемою переходу на літній час.

Трохи дивний спосіб його вирішити .... :)


Я справді не розумію, чому ОП не вибрав вашу пропозицію:D
php_nub_qq

@php_nub_qq, мабуть, тому, що він працює, змінюючи часовий пояс для всього сценарію, що може бути небажаним та мати непередбачувані наслідки.
felwithe

@felwithe Це не було б, якщо рік пропустити перший рядок, який призначений лише для демонстрації
php_nub_qq

11

Перетворити рядок місцевого часового поясу на рядок 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,
    якщо $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01";
    якщо $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00,
    якщо $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01";
    якщо $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";

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


5

Якщо ви не проти використовувати PHP- клас DateTime , який був доступний з PHP 5.2.0, то існує кілька сценаріїв, які можуть відповідати вашій ситуації:

  1. Якщо у вас є об'єкт $givenDtDateTime, який ви хочете перетворити на UTC, це перетворить його на UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Якщо вам потрібен оригінал $givenDtпізніше, можливо, ви захочете клонувати даний об'єкт DateTime перед перетворенням клонованого об'єкта:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. Якщо у вас є лише рядок datetime, наприклад $givenStr = '2018-12-17 10:47:12', ви спочатку створюєте об'єкт datetime, а потім перетворюєте його. Зауважте, це передбачає, що $givenStrце в налаштованому часовим поясом PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. Якщо вказаний рядок datetime у якомусь часовому поясі відрізняється від того, що встановлений у вашій конфігурації PHP, створіть об’єкт datetime, вказавши правильний часовий пояс (див. Список часових поясів, які підтримує PHP ). У цьому прикладі ми припускаємо місцевий часовий пояс в Амстердамі:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    

4

Оскільки 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

Я колись використовую цей метод:

// 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"));

Працює все MOST часу.


3
Тут дві проблеми. Спочатку не слід віднімати, слід додати зміщення. По-друге, це не працює, якщо місцевий часовий пояс зараз перебуває на літньому та зимовому літньому часу. Залік буде вимкнено на годину. Або Vice Versa. Так що так, це працює БІЛЬШО часу, але не завжди.
ajon



0

спробуй

дата відлуння ('F d Y', strtotime ('2010-01-19 00:00:00'));

виведе:

19 січня 2010 року

вам слід змінити час форматування, щоб побачити інші результати


0

Функція нормалізації загального призначення для форматування будь-якої позначки часу з будь-якого часового поясу в інший. Дуже корисно для зберігання міток часу користувачів з різних часових поясів у реляційній базі даних. Для порівняння баз даних зберігайте мітку часу як UTC і використовуйте зgmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

Використання:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"

0

Ви також можете спробувати це:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

це виведе:

2017-10-25 17:13:20 Азія / Сінгапур

Ви можете використовувати це всередині атрибута значення поля введення тексту, якщо ви хочете відобразити лише дату лише для читання.

видаліть "e", якщо ви не хочете показувати свій регіон / країну.


0

Виконайте наступні кроки , щоб отримати 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)
    

-1

Як покращення відповіді Філла Паффорда (я не зрозумів його "Yd-mTG: i: sz", і він запропонував повернути часовий пояс). Тому я пропоную це (я ускладнив зміну формату HMTL у звичайному / текстовому ...):

<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");

// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";

// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";

// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; 
?>

2
Вам слід відредагувати свою відповідь, щоб пояснити, як це покращує відповідь Філа. Що ви змінили в коді, і чому він кращий?
Коді Грей

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