json date object to php date

前端 未结 5 1271
不知归路
不知归路 2021-01-20 03:54

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

相关标签:
5条回答
  • 2021-01-20 04:30

    @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;
        }
    }
    
    0 讨论(0)
  • 2021-01-20 04:34

    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;
        }    
    }   
    
    0 讨论(0)
  • 2021-01-20 04:38

    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

    0 讨论(0)
  • 2021-01-20 04:53

    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
    
    0 讨论(0)
  • 2021-01-20 04:54

    @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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题