Мне нужен простой способ конвертировать метку даты и времени в UTC (из любого часового пояса, в котором находится сервер) НАДЕЖНО без использования каких-либо библиотек.
90
Попробуйте 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 />");
ПРИМЕЧАНИЕ. Возможно, вам также потребуется установить часовой пояс обратно на исходный.
gmdate
вместо изменения часового пояса по умолчанию на UTC. Потому чтоgmdate
автоматически использует UTC.Используйте strtotime, чтобы сгенерировать метку времени из заданной строки (интерпретируемой как местное время), и используйте gmdate, чтобы получить ее как дату в формате UTC назад.
пример
По запросу, вот простой пример:
echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
источник
Использование 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
источник
Сделайте так:
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
источник
Если у вас есть дата в этом формате ГГГГ-ММ-ЧЧ дд: мм: сс, вы можете обмануть 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
Преобразование строки местного часового пояса в строку 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);
если $ 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";
если $ 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
источник
Если вы не против использовать класс PHP DateTime , который доступен с PHP 5.2.0, то есть несколько сценариев, которые могут соответствовать вашей ситуации:
Если у вас есть
$givenDt
объект DateTime, который вы хотите преобразовать в UTC, он преобразует его в UTC:$givenDt->setTimezone(new DateTimeZone('UTC'));
Если вам понадобится оригинал
$givenDt
позже, вы также можете захотеть клонировать данный объект DateTime перед преобразованием клонированного объекта:$utcDt = clone $givenDt; $utcDt->setTimezone(new DateTimeZone('UTC'));
Если у вас есть только строка datetime, например
$givenStr = '2018-12-17 10:47:12'
, тогда вы сначала создаете объект datetime, а затем конвертируете его. Обратите внимание, это предполагает, что это$givenStr
находится в настроенном часовом поясе PHP.$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
Если указанная строка datetime находится в каком-либо часовом поясе, отличном от часового пояса в вашей конфигурации PHP, создайте объект datetime, указав правильный часовой пояс (см. Список часовых поясов, поддерживаемых PHP ). В этом примере мы предполагаем местный часовой пояс в Амстердаме:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam')); $givenDt->setTimezone(new DateTimeZone('UTC'));
источник
Поскольку 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);
источник
Иногда я использую этот метод:
// 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 времени.источник
http://php.net/manual/en/function.strtotime.php или, если вам нужно использовать не строку, а компоненты времени, тогда http://us.php.net/manual/en/function.mktime. php
источник
С PHP 5 или выше вы можете использовать функцию datetime :: format (см. Документацию http://us.php.net/manual/en/datetime.format.php )
echo strftime( '%e %B %Y' , date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U') ); // 4 May 2012
источник
пытаться
выведет:
вы должны изменить формат времени, чтобы увидеть другой вывод
источник
Функция нормализации общего назначения для форматирования любой временной метки из любого часового пояса в другой. Очень полезно для хранения отметок времени пользователей из разных часовых поясов в реляционной базе данных. Для сравнения баз данных сохраните метку времени как 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; } }
Применение:
источник
в качестве альтернативы вы можете попробовать это:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
это выведет:
вы можете использовать это внутри атрибута value поля ввода текста, если вы хотите отображать только дату, доступную только для чтения.
удалите букву "e", если вы не хотите показывать свой регион / страну.
источник
Выполните следующие действия, чтобы получить время UTC для любого часового пояса, установленного в локальной системе пользователя (это потребуется для веб-приложений, чтобы сохранять разные часовые пояса в UTC):
Javascript (на стороне клиента):
var dateVar = new Date(); var offset = dateVar.getTimezoneOffset(); //getTimezoneOffset - returns the timezone difference between UTC and Local Time document.cookie = "offset="+offset;
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)
источник
Как улучшение ответа Филла Паффорда (я не понял его «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"; ?>
источник