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.