Преобразование метки времени атома с часовым поясом в php

У меня есть данные json, которые содержат отметки времени в формате атома. Некоторые примеры временных меток: 2020-04-12T04: 05: 08.92949232Z
2020-03-24T22: 59: 13.447142853 + 01: 00

Я пытаюсь преобразовать их с помощью 'date ("Ymd g: i: s", strtotime ($ atom)', но, похоже, у него проблемы с форматом + timezone.
Он отлично работает с $ atom = "2020 -04-12T04: 05: 08.92949232Z ".
Но если $ atom =" 2020-03-24T22: 59: 13.447142853 + 01: 00 ", я получаю 1970-01-01 12:00:00.

Я играл с DateTime :: createFromFormat, но я просто не могу заставить его работать. Можно ли разобрать без особых усилий или мне нужно стрелять в парня, создающего файлы json?


person rcy    schedule 12.04.2020    source источник


Ответы (1)


DateTime вызывает проблемы, если после точки более 6 цифр. Вы должны ограничить количество цифр максимум 6 после десятичной точки, тогда выражения будут приняты.

$strDate = '2020-03-24T22:59:13.447142853+01:00';

//reduce microseconds to a maximum of 6
$strDate = preg_replace_callback('~\.\d{7,}~',function($match){
      return ltrim(sprintf('%0.6F',$match[0]),'0');
},$strDate);


$d = date_create($strDate);
var_dump($d);
//object(DateTime)#2 (3) { ["date"]=> string(26) "2020-03-24 22:59:13.447143" ["timezone_type"]=> int(1) ["timezone"]=> string(6) "+01:00" }
person jspit    schedule 13.04.2020