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.
fonte
2015-10-07 17:32:44
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
Ho letto male la tua domanda originale. Mi dispiace per quello Ho aggiornato la risposta. –