Мне нужен простой способ конвертировать отметку времени даты в UTC (из любого временного интервала, на котором находится сервер) НАДЕЖНО, без использования каких-либо библиотек.
Попробуйте getTimezone и setTimezone , см. Пример
(Но это использует класс)
ОБНОВИТЬ:
Без каких-либо классов вы можете попробовать что-то вроде этого:
$the_date = strtotime("2010-01-19 00:00:00"); echo(date_default_timezone_get() . "<br />"); echo(date("Yd-mTG:i:sz",$the_date) . "<br />"); echo(date_default_timezone_set("UTC") . "<br />"); echo(date("Yd-mTG:i:sz", $the_date) . "<br />");
ПРИМЕЧАНИЕ. Возможно, вам потребуется установить часовой пояс обратно на оригинал
Используйте strtotime для создания метки времени из данной строки (интерпретируемой как локальное время) и используйте gmdate, чтобы получить ее как отформатированную дату UTC.
В соответствии с просьбой, вот простой пример:
echo gmdate('dmY H:i', strtotime('2012-06-28 23:55'));
Использование DateTime:
$given = new DateTime("2014-12-12 14:18:00"); echo $given->format("Ymd H:i:se") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok $given->setTimezone(new DateTimeZone("UTC")); echo $given->format("Ymd H:i:se") . "\n"; // 2014-12-12 07:18:00 UTC
Сделайте так:
gmdate('Ymd H:i:s', $timestamp)
или просто
gmdate('Ymd H:i:s')
получить «СЕЙЧАС» в UTC.
Проверьте ссылку:
Если у вас есть дата в этом формате YYYY-MM-HH dd: mm: ss, вы можете на самом деле обмануть php, добавив UTC в конце вашей строки «datetime» и используйте strtotime для его преобразования.
date_default_timezone_set('Europe/Stockholm'); print date('Ymd H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n"; print date('Ymd H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";
Это напечатает следующее:
2009-01-01 13:00:00 2009-06-01 14:00:00
И, как вы можете видеть, он также заботится о проблеме с летним временем.
Немного странный способ его решить …. 🙂
Поскольку 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('Ymd 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("Ymd H:i:s", strtotime($original_time." -".$offset." Seconds"));
Работает все самое время.
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('Ydm G:i:s', '2012-04-05 11:55:21')->format('U') ); // 4 May 2012
Преобразование строки локального часового пояса в строку UTC.
например, Часовой пояс Новой Зеландии
$datetime = "2016-02-01 00:00:01"; $given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland")); $given->setTimezone(new DateTimeZone("UTC")); $output = $given->format("Ymd H:i:s"); echo ($output);
Как улучшение ответа Филла Паффорда (я не понял его «Yd-mTG: i: sz», и он предложил вернуть часовой пояс). Поэтому я предлагаю это (я усложнил, изменив формат HMTL в plain / text …):
<?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("Ymd\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n"; echo date("Ymd 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"; ?>
пытаться
echo date ('F d Y', strtotime ('2010-01-19 00:00:00'));
выведет:
19 января 2010
вы должны изменить время форматирования, чтобы увидеть другой результат
Функция нормализации общего назначения для форматирования любой временной метки из любого часового пояса в другой. Очень полезно для хранения datetimestamps пользователей из разных часовых поясов в реляционной базе данных. Для сравнения баз данных gmdate('Ymd H:i:s')
метку времени как UTC и используйте с gmdate('Ymd 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'] != 'Ymd H:i:s') { $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Ymd 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/YH:i A", 'olsonZone' => 'Asia/Calcutta']; $to = ['localeFormat' => "Ymd H:i:s", 'olsonZone' => 'UTC']; datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
В качестве альтернативы вы можете попробовать следующее:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Ymd H:i:se"); ?>
это выведет:
2017-10-25 17:13:20 Азия / Сингапур
вы можете использовать это внутри атрибута value текстового поля ввода, если вы хотите отображать только дату, доступную только для чтения.
удалите «e», если вы не хотите показывать свой регион / страну.