Я называю веб-сервис, который возвращает мне объект json. Объект json кодирует дату. Я пытаюсь найти способ конвертировать эту дату в формат mdY в php. Объектом Json является {"DateOfBirth": "/ Date (387518400000-0400) /"} эта дата 02-15-1982.
Вебсервис, который я вызываю, находится в .NET, и он преобразует дату в объект JSON. Не уверен, что это поможет.
заранее спасибо
Спасибо, Танмай
Если есть шанс, что вы сказали 02-15-1982, но на самом деле означало 04-12-1982, то у меня есть решение. Если нет, то есть промежуток времени около 60 дней, что можно объяснить немного более математикой.
Вот мое решение:
date_default_timezone_set( 'America/Denver' ); $json = json_decode( '{"DateOfBirth":"\/Date(387518400000-0400)\/"}' ); $date_string = $json -> DateOfBirth; preg_match( '/([\d]{9})/', $date_string, $matches ); // gets just the first 9 digits in that string echo date( 'md-Y', $matches[0] );
Это возвращает: 04-12-1982
Я знаю, что этот вопрос / ответ старый, но я хотел добавить, что ответ @hookedonwinter больше не правильный. Хотя его ответ, возможно, решил конкретное решение, здесь, в 2012 году, теперь у нас есть дополнительное десятичное место для ухода.
echo parseJsonDate('/Date(1336197600000-0600)/', 'date'); public function parseJsonDate($date, $type = 'date') { preg_match( '/\/Date\((\d+)([+-]\d{4})\)/', $date, $matches); // Match the time stamp (microtime) and the timezone offset (may be + or -) $date = date( 'md-Y', $matches[1]/1000 ); // convert to seconds from microseconds switch($type) { case 'date': return $date; // returns '05-04-2012' break; case 'array': return explode('-', $date); // return array('05', '04', '2012') break; case 'string': return $matches[1] . $matches[2]; // returns 1336197600000-0600 break; } }
@Brombomb
Ваша функция работает нормально, но есть одна вещь, которую вы забыли. Временные метки могут быть отрицательными для дат до 01.01.1970, поэтому нам нужен другой regEx
Я использовал этот, и он отлично работает:
preg_match( '/\/Date\((-?\d+)([+-]\d{4})\)/', $date, $matches);
В конце я немного изменил вашу функцию, чтобы стать более полезным для меня. Теперь я могу решить, вернуть ли я дату
и я могу решить, хочу ли я, чтобы разница с часовым поясом UTC была добавлена / вычтена, когда я даю третий параметр …
function parseJsonDate($date, $type = 'date', $utc = 0) { // Match the time stamp (microtime) and the timezone offset (may be + or -) and also negative Timestamps preg_match( '/\/Date\((-?\d+)([+-]\d{4})\)/', $date, $matches); $seconds = $matches[1]/1000; // microseconds to seconds $UTCSec = $matches[2]/100*60*60; // utc timezone difference in seconds if($utc != 0){ $seconds = $seconds + $UTCSec; // add or divide the utc timezone difference } $date = date( 'Ym-d', $seconds ); // only date $dateTime = date( 'Ymd H:i:s', $seconds ); // date and time $time = date( 'H:i:s', $seconds ); // only time switch($type) { case 'date': return $date; // returns 'YYYY-MM-DD' break; case 'datetime': return $dateTime; // returns 'YYYY-MM-DD HH:ii:ss' break; case 'time': return $time; // returns 'HH:ii:ss' break; case 'array': $dateArray = str_replace(" ", "-", $dateTime); $dateArray = str_replace(":", "-", $dateArray); return explode('-', $dateArray); // return array('YYYY', 'MM', 'DD', 'HH', 'ii', 'SS') break; case 'string': return $matches[1] . $matches[2]; // returns 1336197600000-0600 break; } }
@Brombomb в моем случае я добавил к вашей функции другой параметр для возврата объекта Date:
public function parseJsonDate( $date, $type = 'date' ) { // removes extra millisecond digits in an other reg exp class preg_match( '/\/Date\((\d{10})\d+([+-]\d{4})\)/', $date, $matches ); // Match the time stamp (microtime) and the timezone offset (may be + or -) $date = date( 'md-Y', $matches[1] ); switch( $type ) { case 'dateTimezone': return DateTime::createFromFormat( 'UT', $matches[1] . $matches[2] ); case 'date': return $date; // returns '05-04-2012' break; case 'array': return explode( '-', $date ); // return array('05', '04', '2012') break; case 'string': return $matches[1] . $matches[2]; // returns 1336197600000-0600 break; } }