How to return ISO date format in PHP for MongoDB?
Asked Answered
P

4

14

I want to store the current date generated from PHP into MongoDB collection as an ISO date formate.

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

However I am not able to generate such Kind of date in php which will be stored in MongoDB as an ISODate format.

This is what I ve done.

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

and it is outputting something like,

0.00000000 1353305590

which is not the format I need. How to do this?

Proctoscope answered 19/11, 2012 at 6:18 Comment(0)
P
17

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: https://www.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"));
Puklich answered 19/11, 2012 at 6:24 Comment(2)
but if i store the result in a collection, will it get stored as ISODate("2012-11-02T08:40:12.569Z") or simply 2012-11-02T08:40:12.569Z ???Proctoscope
I misread your original question. Sorry about that. I've updated the answer.Puklich
C
2

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.

Calculous answered 7/10, 2015 at 17:32 Comment(1)
This worked great for me thanks. I was passing a date search query through a private API I developed, and needed to pass a date. I was able to use your date format and extended JSON to pass mongo Date objects through to my API properly: docs.mongodb.com/manual/reference/mongodb-extended-jsonTimbuktu
L
2
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;
Leverett answered 28/5, 2019 at 11:25 Comment(0)
F
0

You can convert ISODate time by using below code.

   * return ISO-8601 date format:YYYY-MM-DD'T'HH:mm:ss.sssXXX , for example: 2015-09-07T10:13:45.110-07:00 .
   */

date("Y-m-d\TH:i:s.000P", strtotime($date));
Frazil answered 22/3, 2021 at 10:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.