2010-07-26 7 views
3

J'appelle un webservice qui me renvoie un objet json. L'objet json code la date. J'essaye de trouver un moyen de convertir cette date au format m-d-Y en PHP. L'objet Json est {"DateOrBirth": "/ Date (387518400000-0400) /"} cette date est 02-15-1982.json date objet à php date

Le service web que j'appelle est en .NET et il convertit la date en l'objet JSON. Je ne sais pas si cela aiderait.

Merci à l'avance

Merci, Tanmay

+0

Est-ce le 04-12-1982 par hasard, et non le 02-15-1982? – hookedonwinter

+0

En utilisant la solution d'AinStain (qui est nécessaire si les dates sont négatives (avant 1970) cette date semble être 1982-04-13 –

Répondre

1

S'il y a une chance que vous avez dit 15/02/1982 mais signifiait vraiment 12/04/1982, alors j'ai une solution. Sinon, il y a un écart d'environ 60 jours, ce qui peut s'expliquer par un peu plus de maths.

Voici ma solution pour l'instant:

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]); 

Ce retourne: 04-12-1982

+0

@hookedonwinter: Merci pour votre réponse mais, la date est 15/02/1982 Pour moi aujourd'hui l'objet json était comme - {"DateOfBirth": "\/Date (382597200000-0500) \ /"} c'est encore 15/02/1982.J'ai discuté avec le développeur .NET du webservice, il dit comme .NET il auto analyse la date pour lui et crée l'objet JSON pour lui. Donc il semble que .NET fasse une conversion spécifique !!! permettez-moi d'ajouter .NET TAG, si quelqu'un peut savoir. Merci quand même pour vôtre aide. – jtanmay

+0

Dans votre commentaire vous avez la valeur 382597200000, mais dans votre question vous avez 387518400000. Vous dites que les deux sont 02-15-1982, mais je crois que @hookedonwinter qu'il y a une erreur dans la date spécifiée dans la question. La solution de hookedonwinter fonctionne bien si c'est le cas, alors je vote pour ça. –

+0

@kevin: Je crois que c'est un horodatage, le nombre changerait tous les jours. Le numéro que j'ai demandé 387518400000-0400, était hier. S'il vous plaît laissez-moi savoir si j'ai tort. @hookedonwinter: Votre logique a fonctionné pour moi sauf si je règle le fuseau horaire, comme vous le faites dans votre code, cela me donne 04-12-192, MAIS si je ne spécifie pas le fuseau horaire qu'il me donne 02 -15-1982. Actuellement, je suis dans le fuseau horaire EST. Je n'ai pas beaucoup d'expérience sur datetime. Mais votre suggestion a fonctionné pour moi. Merci beaucoup. Marquage comme la bonne réponse. – jtanmay

3

Je sais que cette question/réponse est vieux, mais je voulais ajouter que la réponse @hookedonwinter n'est plus correcte. Alors que sa réponse a pu résoudre la solution spécifique, ici en 2012, nous avons maintenant une décimale supplémentaire à prendre en charge.

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 dans mon cas, j'ajouté à votre fonction d'un autre paramètre pour renvoyer un objet 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('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

Votre fonction fonctionne très bien, mais il y a une chose que vous oublié. Horodatage peut être négatif pour les dates avant le 01.01.1970, nous avons donc besoin d'un autre regex

je celui-ci et il fonctionne très bien:

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

A la fin i modifié votre fonction un peu à devenir plus utile pour moi. Maintenant, je peux décider si je reçois la date de retour comme

  • "date" => seule date
  • "temps" => temps que
  • "datetime" => date et l'heure
  • " tableau »=> date et l'heure comme un tableau
  • « string »=> l'horodatage en tant que chaîne

et je peux décider si je veux la différence du fuseau horaire UTC ajouté/quand soustrait je donne le troisième paramètre ...

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