PHP преобразует неизвестную строку даты и времени в объект даты и времени

У меня возникли проблемы со следующей строкой, которая должна быть дата-время (ответ API).

2013-03-08T19: 11: 11,234 + 0000

Мне нужно преобразовать строку в ISO 8601.
Точный формат должен выглядеть так:

2016-03-01T12: 00: 00 + 00: 00

Если бы кто-то мог помочь мне сделать это в php, было бы здорово, но я был бы уже более чем счастлив, если бы кто-то мог определить формат (например, yyyy-mm-ddThh:mm:ss).

0

Решение

Похоже, 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"}
3

Другие решения

Я предлагаю вам использовать Carbon: http://carbon.nesbot.com/docs/

echo Carbon::parse('2013-03-08T19:11:11.234+0000')->toAtomString();

Кроме того, вам нужен формат ATOM, а не ISO 8601. Вы можете сделать @Arcesilas способом, он тоже должен работать.

1

По вопросам рекламы [email protected]