Formato data / data PHP (1365004652303-0500) /

Sto chiamando un'API da cui sto ricevendo la data /Date(1365004652303-0500)/ , non capisco che formato sia. Come viene chiamato questo formato di data? Non ero sicuro su cosa google per questo tipo di formato.

Qualcuno mi può aiutare a get questa data in Ymd H:i:s formato?

L'API che sto chiamando è su server .NET. E quando lo chiamo usando PHP file_get_contents e json_decode mi dà il seguente formato Data per la data di creazione: /Date(1365004652303-0500)/

Per prima cosa devi capire il formato che hai

 /Date(1365004652303-0500)/ 

Allora hai

  • data e ora (U) = 1365004652
  • Milliseconds (u) = 303
  • Differenza rispetto al tempo di Greenwich (GMT) (O) = -0500

Costruisci un formato

 $date = '/Date(1365004652303-0500)/'; preg_match('/(\d{10})(\d{3})([\+\-]\d{4})/', $date, $matches); $dt = DateTime::createFromFormat("UuO",vsprintf('%2$s.%3$s.%4$s', $matches)); echo $dt->format('r'); 

Produzione

 Wed, 03 Apr 2013 15:57:32 -0500 ^ |= Can you see the GMT ? 

 interface DateFormatParser { /** * @param $string * * @return DateTime */ public function parse($string); } abstract class PregDateParser implements DateFormatParser { protected $pattern, $format, $mask; public function parse($string) { $string = (string)$string; $pattern = $this->pattern; $format = $this->format; $mask = $this->mask; $r = preg_match($pattern, $string, $matches); if (!$r) { throw new UnexpectedValueException('Preg Regex Pattern failed.'); } $buffer = vsprintf($mask, $matches); $result = DateTime::createFromFormat($format, $buffer); if (!$result) { throw new UnexpectedValueException(sprintf('Failed To Create from Format "%s" for "%s".', $format, $buffer)); } return $result; } } class JsonTimestampWithOffsetParser extends PregDateParser { protected $pattern = '/^\/Date\((\d{10})(\d{3})([+-]\d{4})\)\/$/'; protected $format = 'UuO'; protected $mask = '%2$s.%3$s.%4$s'; } $date = '/Date(1365004652303-0500)/'; $parser = new JsonTimestampWithOffsetParser; $dt = $parser->parse($date); echo $dt->format('r'); 

Prova questo:

 var_dump(date('Ymd H:i:s', '1365004652303'/1000)); $str = '/Date(1365004652303-0500)/'; $match = preg_match('/\/Date\((\d+)([-+])(\d+)\)\//', $str, $date); $timestamp = $date[1]/1000; $operator = $date[2]; $hours = $date[3]*36; // Get the seconds $datetime = new DateTime(); $datetime->setTimestamp($timestamp); $datetime->modify($operator . $hours . ' seconds'); var_dump($datetime->format('Ymd H:i:s')); 

Ritorna:

 string(19) "2013-04-03 17:57:32" string(19) "2013-04-03 12:57:32" 

Let's break /Date(1365004652303-0500)/ giù a:

  • Data
  • 1365004652303
  • -0500

La prima string si rende abbastanza chiara.

Il prossimo grande numero è il valore d'epoca

Il valore -0500 rappresenta il fuso orario in cui le date sono state inizialmente memorizzate. È relativo all'UTC e quindi si riferisce al fuso orario orientale.


MODIFICARE

L'epoca ha una precisione milliseconda. Prova questo codice:

 <?php $str = "/Date(1365004652303-0500)/"; preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $str, $match ); echo date( "r", $match[1] ); ?> 

Puoi anche utilizzare il fuso orario per impostare la data relativa al tuo. http://codepad.viper-7.com/RrSkMy

Questo timestamp è in millisecondi, motivo per cui è così grande.

Puoi utilizzare la chiamata a PHP date () per formattare questo timestamp come desideri. Basta dividere per 1.000 prima. Nel formato standard degli Stati Uniti, lo sarebbe

$ mydate = date ('md Y', $ timestamp);

(where $ timestamp è 1365004652303)

Per formattarlo nel formato richiesto (Ymd H: i: s) si usa 'Ymd H: i: s' come string di formato (primo parametro). Elimina il text iniziando con "-".

 $stamps = preg_split("/-/", $time); $stamps[0] = $stamps[0]/1000; $mydate = date('Ymd H:i:s', $stamps[0]); 

Questo produce 2013-04-03 11:57:32

Altri hanno suggerito che il 0500 sia un offset; se è così, vorresti regolare $ franco [0] di conseguenza.

Se la data è come /Date(-62135578800000)/ , un numero integer positivo o negativo senza fuso orario:

 $date = substr('/Date(-62135578800000)/', 6, -5); $date = date('m/d/YH:i:s', $date + date('Z', $date) * -1); // 01/01/0001 05:00:00 

Nell'esempio seguente viene utilizzata la preg_match() e DateTime :

 $date = '/Date(1365004652303-0500)/'; // get the timestamp $pattern = '~/Date\(([0-9]*)~'; preg_match($pattern, $date, $matches); $timestamp = round(((int) $matches[1]) / 1000); $dt = new DateTime(); $dt->setTimestamp($timestamp); echo $dt->format('Ymd H:i:s'); 

Ho avuto un'esperienza leggermente diversa che mi ha portto a fare un paio di piccole modifiche all'eccellente risposta di Baba.

Usando la libreria JSON di Newtonsoft per codificare i messaggi in .NET, che poi invio al nostro sito web (la parte PHP), ottengo uno spazio prima dello scostamento del fuso orario e nessun carattere +/-.

Ho anche visto numbers negativi da date pre-epoca, il che significa che ho dovuto soddisfare un segno – prima del valore in millisecondi.

Ho modificato la regex con questo e funziona perfettamente per me:

^/Date(([-]?\d{10})(\d{3})\s?([+-]?\d{4}))/$

Le due differenze sono

[-]? prima del valore in millisecondi a 10 cifre e \s? prima del fuso orario.

Lo metterei come commento alla risposta di Baba, ma la mia mancanza di reputazione non mi permette. Spero che per me sia appropriato postare qui perché pensavo che potesse essere utile.