I am calling a webservice which return me back a json object. The json object encodes the date. I am trying to find a way to convert that date to m-d-Y format in php. Json object is {"DateOfBirth":"/Date(387518400000-0400)/"} this date is 02-15-开发者_StackOverflow社区1982.
The webservice which I am calling is in .NET, and it converts the date to the JSON object. Not sure if this would help.
Thanks in advance
Thanks, Tanmay
I know this question/answer is old, but I wanted to add that the @hookedonwinter answer is no longer correct. While his answer may have solved the specific solution, here in 2012 we now have an extra decimal place to take care of.
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( 'm-d-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
Your Function works fine, but there is one thing you forgot. Timestamps can be negative for Dates before the 01.01.1970, so we need a different regEx
I used this one and it works fine:
preg_match( '/\/Date\((-?\d+)([+-]\d{4})\)/', $date, $matches);
At the end i modified your Function a little bit to become more usefull for me. Now i can decide if i get the Date back as
- "date" => date only
- "time" => time only
- "datetime" => date and time
- "array" => date and time as an array
- "string" => the timestamp as a string
and i can decide if i want the difference to the UTC timezone added/substracted when i give the third parameter...
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( 'Y-m-d', $seconds ); // only date
$dateTime = date( 'Y-m-d 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;
}
}
If there's a chance you said 02-15-1982 but really meant 04-12-1982, then I have a solution. If not, then there's a gap in the time of about 60 days, which can be accounted for with a bit more math.
Here's my solution for now:
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( 'm-d-Y', $matches[0] );
This returns: 04-12-1982
You can use this package to parse the JSON dates:
https://github.com/webapix/dot-net-json-date-formatter
use \Webapix\DotNetJsonDate\Date;
Date::toDateTime('/Date(387518400000-0400)/'); // return with \DateTime object
@Brombomb in my case I added to your function an other parameter to return a Date Object:
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( 'm-d-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;
}
}
精彩评论