Я называю 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)/
Тогда у вас есть
Создание формата
$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)/
вниз:
Первая строка становится понятной.
Следующее большое число – это значение эпохи
-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?
перед смещением часового пояса.
Я бы поставил это как комментарий к ответу Бабы, но моя нехватка репутации не позволяет мне. Надеюсь, это уместно для меня разместить здесь, поскольку я думал, что это может быть полезно.