2012-11-19 13 views
11

Desidero memorizzare la data corrente generata da PHP nella raccolta MongoDB come formato data ISO.Come restituire il formato di data ISO in PHP per MongoDB?

ISODate("2012-11-02T08:40:12.569Z") 

Tuttavia io non sono in grado di generare questo tipo di data in php che sarà memorizzata in MongoDB come formato isodate.

Questo è quello che ho fatto.

$d = new MongoDate(time()); 
echo $d; 

ed è l'output qualcosa di simile,

0.00000000 1353305590 

che non è il formato che ho bisogno. Come fare questo?

risposta

14

è possibile eseguire la funzione __toString, o utilizzare il sec campo

__toString restituirà un timestamp in usecs, che è possibile passare a date() dopo la separazione i secondi da millisecondi - Leggi qua: http://us1.php.net/manual/en/mongodate.tostring.php

O , Personalmente preferisco avere mongodb restituire solo i secondi, che possono essere inseriti direttamente in date() - leggi qui: http://php.net/manual/en/class.mongodate.php

Inoltre, se stai generando un Mongo Date() per ora, non è necessario specificare time();

Al fine di restituire un isodate, è necessario fare questo:

echo date(DATE_ISO8601, (new MongoDate())->sec); 

...

$exampleDate = new MongoDate(); 
echo date(DATE_ISO8601, $exampleDate->sec); 

EDIT: Per salvare la data ISO, è necessario effettuare le seguenti operazioni:

$mongoDateObject = new MongoDate(strtotime("2012-11-02T08:40:12.569Z")); 
+0

ma se memorizzo il risultato in una raccolta, verrà memorizzato come ISODate ("2012-11-02T08: 40: 12.569Z") o semplicemente 2012-11-02T08: 40: 12.569Z ??? – user1518659

+0

Ho letto male la tua domanda originale. Mi dispiace per quello Ho aggiornato la risposta. –

2

Per chiarezza, consideriamo il seguente caso d'uso:

012.

È necessario convertire una stringa nel formato esteso ISO 8601 esteso (ad es. restituito da Javascript Date.prototype.toISOString()) da e verso l'oggetto MongoDate di PHP, mantenendo la massima precisione durante la conversione.

In questo formato, la stringa ha sempre una lunghezza di 24 caratteri: YYYY-MM-DDTHH:mm:ss.sssZ. Il fuso orario è sempre uguale allo zero UTC, come indicato dal suffisso Z.

Per mantenere i millisecondi, dovremo sfruttare l'oggetto DateTime di PHP.

Da stringa MongoDate:

$stringDt = "2015-10-07T14:28:41.545Z"; 

Metodo 1 (usando date_create_from_format):

$phpDt = date_create_from_format('Y-m-d\TH:i:s.uP', $stringDt); 
$MongoDt = new \MongoDate($phpDt->getTimestamp(), $phpDt->format('u')); 

Metodo 2 (usando strtotime):

$MongoDt= new \MongoDate(strtotime ($stringDt), 
    1000*intval(substr($stringDt, -4, 3)) // cut msec portion, convert msec to usec 
); 

Da MongoDate a stringa:

$MongoDt = new \MongoDate(); // let's take now for example 
$stringDt = 
    substr(
     (new \DateTime()) 
     ->setTimestamp($MongoDt->sec) 
     ->setTimeZone(new \DateTimeZone('UTC')) 
     ->format(\DateTime::ISO8601), 
    0, -5) // taking the beginning of DateTime::ISO8601-formatted string 
    .sprintf('.%03dZ', $MongoDt->usec/1000); // adding msec portion, converting usec to msec 

Spero che questo aiuti.

+0

Questo ha funzionato alla grande per me, grazie. Stavo passando una query di ricerca di date tramite un'API privata che avevo sviluppato e che avevo bisogno di passare una data. Sono stato in grado di utilizzare il formato della data e il JSON esteso per passare correttamente gli oggetti mongo Date alla mia API: https://docs.mongodb.com/manual/reference/mongodb-extended-json/ – Mazzy

Problemi correlati