Формат даты в формате PHP / Дата (1365004652303-0500) /

Я называю API, откуда я получаю дату /Date(1365004652303-0500)/ , я не понимаю, какой формат это. Как называется этот формат даты? Я не был уверен, что делать с Google для такого формата.

Может ли кто-нибудь помочь мне получить эту дату в Ymd H:i:s ?

API, который я вызываю, находится на сервере .NET. И когда я называю это с помощью json_decode PHP file_get_contents и json_decode он дает мне следующий формат даты для созданной даты: /Date(1365004652303-0500)/

Сначала вам нужно понять формат, который у вас есть.

 /Date(1365004652303-0500)/ 

Тогда у вас есть

  • временная метка (U) = 1365004652
  • Миллисекунды (u) = 303
  • Разница с Гринвичским временем (GMT) (O) = -0500

Создание формата

 $date = '/Date(1365004652303-0500)/'; preg_match('/(\d{10})(\d{3})([\+\-]\d{4})/', $date, $matches); $dt = DateTime::createFromFormat("UuO",vsprintf('%2$s.%3$s.%4$s', $matches)); echo $dt->format('r'); 

Вывод

 Wed, 03 Apr 2013 15:57:32 -0500 ^ |= Can you see the GMT ? 

 interface DateFormatParser { /** * @param $string * * @return DateTime */ public function parse($string); } abstract class PregDateParser implements DateFormatParser { protected $pattern, $format, $mask; public function parse($string) { $string = (string)$string; $pattern = $this->pattern; $format = $this->format; $mask = $this->mask; $r = preg_match($pattern, $string, $matches); if (!$r) { throw new UnexpectedValueException('Preg Regex Pattern failed.'); } $buffer = vsprintf($mask, $matches); $result = DateTime::createFromFormat($format, $buffer); if (!$result) { throw new UnexpectedValueException(sprintf('Failed To Create from Format "%s" for "%s".', $format, $buffer)); } return $result; } } class JsonTimestampWithOffsetParser extends PregDateParser { protected $pattern = '/^\/Date\((\d{10})(\d{3})([+-]\d{4})\)\/$/'; protected $format = 'UuO'; protected $mask = '%2$s.%3$s.%4$s'; } $date = '/Date(1365004652303-0500)/'; $parser = new JsonTimestampWithOffsetParser; $dt = $parser->parse($date); echo $dt->format('r'); 

Попробуйте это:

 var_dump(date('Ymd H:i:s', '1365004652303'/1000)); $str = '/Date(1365004652303-0500)/'; $match = preg_match('/\/Date\((\d+)([-+])(\d+)\)\//', $str, $date); $timestamp = $date[1]/1000; $operator = $date[2]; $hours = $date[3]*36; // Get the seconds $datetime = new DateTime(); $datetime->setTimestamp($timestamp); $datetime->modify($operator . $hours . ' seconds'); var_dump($datetime->format('Ymd H:i:s')); 

Возвращает:

 string(19) "2013-04-03 17:57:32" string(19) "2013-04-03 12:57:32" 

Перерыв /Date(1365004652303-0500)/ вниз:

  • Дата
  • 1365004652303
  • -0500

Первая строка становится понятной.

Следующее большое число – это значение эпохи

-0500 представляет собой часовой пояс, в котором даты были первоначально сохранены. Это относительно UTC, и, следовательно, это относится к Восточному стандартному времени.


РЕДАКТИРОВАТЬ

Эпоха с миллисекундной точностью. Попробуйте этот код:

 <?php $str = "/Date(1365004652303-0500)/"; preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $str, $match ); echo date( "r", $match[1] ); ?> 

Вы также можете использовать часовой пояс для установки даты относительно вашей. http://codepad.viper-7.com/RrSkMy

Эта метка времени находится в миллисекундах, поэтому она такая большая.

Вы можете использовать вызов PHP date () для форматирования этой метки времени по вашему желанию. Сначала разделите на 1000. В стандартном формате США это было бы

$ mydate = date ('md Y', $ timestamp);

(где $ timestamp – 1365004652303)

Чтобы отформатировать его в запрошенном формате (Ymd H: i: s), вы должны использовать «Ymd H: i: s» в качестве строки формата (первый параметр). Отбросьте текст, начинающийся с «-».

 $stamps = preg_split("/-/", $time); $stamps[0] = $stamps[0]/1000; $mydate = date('Ymd H:i:s', $stamps[0]); 

Это дает 2013-04-03 11:57:32

Другие предположили, что 0500 является смещением; если это так, вы хотите настроить $ stamp [0] соответственно.

Если ваша дата похожа на /Date(-62135578800000)/ , положительное или отрицательное целое число без часовой пояс:

 $date = substr('/Date(-62135578800000)/', 6, -5); $date = date('m/d/YH:i:s', $date + date('Z', $date) * -1); // 01/01/0001 05:00:00 

В следующем примере используются классы preg_match() и DateTime :

 $date = '/Date(1365004652303-0500)/'; // get the timestamp $pattern = '~/Date\(([0-9]*)~'; preg_match($pattern, $date, $matches); $timestamp = round(((int) $matches[1]) / 1000); $dt = new DateTime(); $dt->setTimestamp($timestamp); echo $dt->format('Ymd H:i:s'); 

У меня был немного иной опыт, который заставил меня сделать пару незначительных изменений в превосходном ответе Бабы.

Используя библиотеку JSON от Newtonsoft для кодирования сообщений в .NET, которую я затем отправляю на наш сайт (часть PHP), я получаю пробел до смещения часового пояса и символ +/-.

Я также видел отрицательные числа от дат до эпохи, что означает, что мне нужно обслуживать знак до миллисекундного значения.

Я изменил это регулярное выражение, и он отлично работает для меня:

^/Date(([-]?\d{10})(\d{3})\s?([+-]?\d{4}))/$

Эти два различия

[-]? перед 10-значным миллисекундным значением и \s? перед смещением часового пояса.

Я бы поставил это как комментарий к ответу Бабы, но моя нехватка репутации не позволяет мне. Надеюсь, это уместно для меня разместить здесь, поскольку я думал, что это может быть полезно.