У меня возникли проблемы со следующей строкой, которая должна быть дата-время (ответ API).
2013-03-08T19: 11: 11,234 + 0000
Мне нужно преобразовать строку в ISO 8601.
Точный формат должен выглядеть так:
2016-03-01T12: 00: 00 + 00: 00
Если бы кто-то мог помочь мне сделать это в php, было бы здорово, но я был бы уже более чем счастлив, если бы кто-то мог определить формат (например, yyyy-mm-ddThh:mm:ss
).
Похоже, API возвращает время в миллисекундах.
Попробуй это:
$date = '2013-03-08T19:11:11.234+0000';
$format = 'Y-m-d\TH:i:s.uO';
$dt = DateTime::createFromFormat($format, $date);
echo $dt->format(DateTime::ISO8601);
Результат:
2013-03-08T19:11:11+0000
РЕДАКТИРОВАТЬ
Исходя из комментариев к вашему ответу, вам нужно перевести такое время:
2016-03-01T11:01:51.126044 00:00
Поскольку невозможно проанализировать этот формат с помощью DateTime, сначала необходимо сделать его читаемым.
Есть много способов сделать это. Что нам нужно, это добавить +
до часового пояса, так что мой код выше работает.
Если вы уверены, что дата получения API всегда этот формат, и что там будет всегда быть только 1 пробел в строке, просто замените строку пробелом:
$date = '2016-03-01T11:01:51.126044 00:00';
str_replace(' ', '+', $date);
$format = 'Y-m-d\TH:i:s.uP';
$dt = DateTime::createFromFormat($format, $date);
echo $dt->format(DateTime::ISO8601);
Это должно работать (обратите внимание, что здесь маска часового пояса P
так как есть двоеточие)
Вы также можете использовать preg_replace()
вместо DateTime, если вам не нужна дата для расчетов:
$date = '2016-03-01T11:01:51.126044 00:00';
$date = preg_replace('`(\.[0-9]+\s)`', '+', $date);
echo $date;
Это производит:
2016-03-01T11:01:51+00:00
Если вам нужна дата для расчета, просто конвертируйте ее в DateTime после:
$date = '2016-03-01T11:01:51.126044 00:00';
$date = preg_replace('`(\.[0-9]+\s)`', '+', $date);
$date = DateTime::createFromFormat(DateTime::ISO8601, $date);
var_dump($date);
Это производит:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2016-03-01 11:01:51.000000"["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+00:00"}
Я предлагаю вам использовать Carbon: http://carbon.nesbot.com/docs/
echo Carbon::parse('2013-03-08T19:11:11.234+0000')->toAtomString();
Кроме того, вам нужен формат ATOM, а не ISO 8601. Вы можете сделать @Arcesilas способом, он тоже должен работать.