2010-07-26 3 views
3

나는 json 객체를 다시 돌려주는 webservice를 호출하고 있습니다. json 개체가 날짜를 인코딩합니다. 나는 그 날짜를 PHP에서 m-d-Y 형식으로 변환하는 방법을 찾으려고 노력하고있다. Json 개체는 { "DateOfBirth": "/ Date (387518400000-0400) /"}이 날짜는 02-15-1982입니다.json 날짜 PHP 대상 날짜

호출중인 webservice는 .NET에 있으며 날짜를 JSON 객체로 변환합니다. 이것이 도움이되는지 확실하지 않습니다. 사전에

감사

덕분에, Tanmay

+0

04-12-1982는 우연히, 02-15-1982가 아니겠습니까? – hookedonwinter

+0

AinStain의 솔루션 사용 (날짜가 음수 (1970 년 이전) 날짜가 1982-04-13 인 것으로 보이는 경우 필요) –

답변

1

당신이 1982년 2월 15일하지만 실제로는 1982년 4월 12일을 의미 말했다 기회가 있다면, 나는 해결책을 가지고 있습니다. 만약 그렇지 않다면, 약 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('m-d-Y', $matches[0]); 

이 반환 04-12-1982

+0

@hookedonwinter : 답장을 보내 주셔서 감사합니다. 날짜는 1982 년 2 월 15 일입니다 나를 위해 오늘 json 객체는 {- "DateOfBirth": "\/Date (382597200000-0500) \ /"}와 동일합니다. 다시 이것은 1982 년 2 월 15 일입니다.저는 webservice의 .NET 개발자와 논의한 적이 있습니다. 그는 .NET과 마찬가지로 자체 날짜를 파싱하고 그에 대한 JSON 객체를 만듭니다. 그래서 그것은 .NET이 특정 변환을 수행하고있는 것 같습니다 !!! 어떤 사람이 알고 있다면 .NET TAG를 추가하겠습니다. 그래도 도와 ​​줘서 고마워. – jtanmay

+0

귀하의 의견에 382597200000 값이 있지만 질문에 387518400000 있습니다. 당신은 둘 다 02-15-1982라고하지만, 질문에 지정된 날짜에 오류가 있다는 것을 @hookedonwinter처럼 믿습니다. 이 경우 hookedonwinter의 솔루션이 잘 작동하므로 투표를합니다. –

+0

@kevin : 저는 타임 스탬프로 숫자가 매일 바뀔 것이라고 믿습니다. 어제 나는 387518400000-0400에 물었다. 내가 틀렸다면 알려주세요. @hookedonwinter : 당신의 논리가 나를 위해 일하는 것을 제외하고는, 만약 당신이 당신의 코드에서하고있는 것처럼 시간대를 설정했다면, 그것은 04-12-192를 제공하지만, 제가 시간대를 지정하지 않으면 02를 제공합니다. -15-1982. 현재 나는 EST 표준 시간대에 있습니다. 나는 datetime에 많은 경험이 없습니다. 하지만 당신 제안은 저에게 효과적이었습니다. 고마워. 정답으로 표시합니다. – jtanmay

3

이 질문/답변이 오래 알고 있지만, 나는 @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('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

@Brombomb 나는 날짜 개체 반환하는 함수에 다른 매개 변수를 추가 :

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; 
    } 
} 
3

@Brombomb을

귀하의 기능이 잘 작동하지만 한 가지가 당신 잊어 버렸어. 타임 스탬프는 1970년 1월 1일 전에 날짜 부정적 일 수있다, 그래서 우리는 나는이 하나를 사용하는 다른 정규식을

이 필요하고 그것을 잘 작동합니다 :

preg_match('/\/Date\((-?\d+)([+-]\d{4})\)/', $date, $matches); 

내가 당신의 기능 약간에 수정 끝에서 나를 위해 더 유용해진다. 내가 다시

  • "날짜"=> 날짜에만
  • "시간"=> 시간에만
  • "날짜"=> 날짜와 시간
  • "로 날짜를 얻는 경우에 지금 내가 결정할 수 있습니다 문자열

하고 난 UTC 시간대에 차이를 원한다면 결정할 수 있듯이 문자열 "=> 소인/substracted 첨가 어레이"

  • 배열로서 = "날짜 및 시간" 제 3의 매개 변수를주세요 ...

    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; 
        } 
    }