How to return ISO date format in PHP for MongoDB?

convert ISO date time in UTC date time here :


$timestamp = $quicky_created_date->__toString(); //ISO DATE Return form mongo database
$utcdatetime = new MongoDB\BSON\UTCDateTime($timestamp);
$datetime = $utcdatetime->toDateTime();
$time=$datetime->format(DATE_RSS);
$dateInUTC=$time;
$time = strtotime($dateInUTC.' UTC');
$dateInLocal = date("d M Y", $time);
echo $dateInLocal; die;

For clarity, let's consider the following use case:

You need to convert a string in the simplified extended ISO 8601 format (e.g. returned by Javascript's Date.prototype.toISOString()) to and from PHP's MongoDate object, while preserving maximum precision during conversion.

In this format, the string is always 24 characters long: YYYY-MM-DDTHH:mm:ss.sssZ. The timezone is always zero UTC offset, as denoted by the suffix Z.

To keep milliseconds, we'll have to leverage PHP's DateTime object.

From string to MongoDate:

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

Method 1 (using 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'));

Method 2 (using strtotime):

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

From MongoDate to string:

$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

Hope this helps.


You could run the __toString function, or use the sec field

__toString will return a timestamp in usecs, which you can pass to date() after separating the seconds from milliseconds - read here: http://us1.php.net/manual/en/mongodate.tostring.php

OR, I personally prefer to have mongodb return just the seconds, which can be plugged directly into date() - read here: http://php.net/manual/en/class.mongodate.php

Also, if you're generating a MongoDate() for right now, you don't need to specify time();

In order to return an isodate, you need to do this:

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

...

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

EDIT: To save your ISO date, you need to do the following:

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