Мне нужен простой способ конвертировать отметку времени даты в UTC (из любого часового пояса, на котором находится сервер) НАДЕЖНО, без использования каких-либо библиотек.
Php конвертировать datetime в UTC
Ответ 1
Попробуйте getTimezone и setTimezone, см. пример
(Но это использует класс)
UPDATE:
Без каких-либо классов вы можете попробовать что-то вроде этого:
$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 />");
ПРИМЕЧАНИЕ. Возможно, вам потребуется также установить часовой пояс на оригинал.
Ответ 2
Используйте strtotime для создания метки времени из данной строки (интерпретируемой как локальное время) и используйте gmdate, чтобы получить его как отформатированную дату UTC.
Пример
В соответствии с запросом, это простой пример:
echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
Ответ 3
Использование 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
Ответ 4
Сделайте так:
gmdate('Y-m-d H:i:s', $timestamp)
или просто
gmdate('Y-m-d H:i:s')
чтобы получить "СЕЙЧАС" в UTC.
Проверьте ссылку:
Ответ 5
Если у вас есть дата в этом формате YYYY-MM-HH dd: mm: ss, вы можете на самом деле обмануть php, добавив UTC в конце вашей строки "datetime" и используйте 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
И как вы можете видеть, он также заботится о проблеме с летним временем.
Немного странный способ его решить....:)
Ответ 6
Я когда-нибудь использую этот метод:
// 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"));
Выполняет все МОСТ того времени.
Ответ 7
As 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);
Ответ 8
http://php.net/manual/en/function.strtotime.php, или если вам не нужно использовать строку, но компоненты времени, а затем http://us.php.net/manual/en/function.mktime.php
Ответ 9
С 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
Ответ 10
Преобразование строки локального часового пояса в строку 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 ";
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 ";
Ответ 11
Как улучшение на Фил Паффорд ответить (я не понял его "Y-d-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("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";
?>
Ответ 12
попробуйте
эхо-дата ('F d Y', strtotime ('2010-01-19 00:00:00'));
выведет:
19 января 2010
вы должны изменить время форматирования, чтобы увидеть другой вывод
Ответ 13
Функция нормализации общего назначения для форматирования любой временной метки из любого часового пояса в другой.
Очень полезно для хранения datetimestamps пользователей из разных часовых поясов в реляционной базе данных. Для сравнения баз данных отметьте метку времени как 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"
Ответ 14
В качестве альтернативы вы можете попробовать следующее:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
это выведет:
2017-10-25 17:13:20 Азия/Сингапур
вы можете использовать это внутри атрибута value текстового поля ввода, если вы хотите отображать только дату, доступную только для чтения.
удалите "e", если вы не хотите показывать свой регион/страну.