2017-01-27 2 views
0

Я получаю временную метку из http://www.unixtimestamp.com/index.phpКак правильно скрывать временную метку ISO 8601 в PHP?

Так 2016/1/1 @ 1:1:1 метка времени должна быть 1451610061 что эквивалентно 2016-01-01T01:01:01+00:00 в ISO 8601 (с сайта), но когда я запускаю код ниже, я хотел бы получить выход 2016-01-01T02:01:01+01:00 вместо , Я что-то упускаю?

$ts = 1451610061; 
echo date('c', $ts); 
+0

Согласно сайту [this] (http://www.onlineconversion.com/unix_time.htm), '1451610061' приводит к' Fri, 01 Jan 2016 01:01:01 GMT', поэтому его проблема с сервером.Возможно, добавьте 'timezone' в' datetime'. – Xorifelse

+0

Здесь тоже хорошо работает https://eval.in/725142 –

ответ

1

Это явно проблема с часовым поясом, как видно из «+00: 00» против «+01: 00».

Вы также можете проверить это, установив часовой пояс по умолчанию перед с date_default_timezone_set

date_default_timezone_set("UTC"); 

2016-01-01T01: 01: 01 + 00: 00

См eval.in - UTC

-

date_default_timezone_set("Europe/Berlin"); 

2016-01-01T02: 01: 01 + 01: 00

См eval.in - Berlin


Вы также можете узнать о локальном часовом поясе с date_default_timezone_get

echo date_default_timezone_get(); 

eval.in - local timezone

UTC

Что также объясняет, почему http://eval.in показывает ожидаемый выход.


Конечно, вы можете установить часовой пояс на DateTime объекта индивидуально

$ts = 1451610061; 
$dt = new DateTime("@$ts"); 

$utc = new DateTimeZone("UTC"); 
$dt->setTimezone($utc); 
echo "UTC=", $dt->format('c'), "\n"; 

$berlin = new DateTimeZone("Europe/Berlin"); 
$dt->setTimezone($berlin); 
echo "Berlin=", $dt->format('c'), "\n"; 

Это покажет

UTC = 2016-01-01T01: 01: 01 + 00: 00
Berlin = 2016-01-01T02: 01: 01 + 01: 00

eval.in - setTimezone


Чтобы, наконец, ответить на ваш вопрос: нет ничего плохого в вашем коде. 2016-01-01T02:01:01+01:00 - это абсолютно достоверное представление этой метки времени в соответствии с ISO 8601 - Wikipedia.

Смежные вопросы