Как вернуть формат даты ISO в PHP для MongoDB?

Я хочу сохранить текущую дату, сгенерированную PHP, в коллекцию MongoDB в качестве формирователя даты ISO.

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

Однако я не могу создать такой вид даты в php, который будет храниться в MongoDB как формат ISODate .

Это то, что я сделал.

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

и он выводит что-то вроде:

 0.00000000 1353305590 

который не соответствует формату. Как это сделать?

Вы можете запустить функцию __toString или использовать поле sec

__toString вернет метку времени в usecs, которую вы можете передать до date() после разделения секунд от миллисекунд – читайте здесь: http://us1.php.net/manual/en/mongodate.tostring.php

ИЛИ, я лично предпочитаю, чтобы mongodb возвращал только секунды, которые можно подключить непосредственно к date() – читайте здесь: http://php.net/manual/en/class.mongodate.php

Кроме того, если вы создаете MongoDate () прямо сейчас, вам не нужно указывать time ();

Чтобы вернуть изодат, вам нужно сделать следующее:

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

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

EDIT: Чтобы сохранить дату ISO, вам необходимо сделать следующее:

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

Для ясности рассмотрим следующий прецедент:

Вам нужно преобразовать строку в упрощенном расширенном формате ISO 8601 (например, возвращенном Date.prototype.toISOString() Javascript в Date.prototype.toISOString() PHP и из MongoDate , сохраняя при этом максимальную точность во время преобразования.

В этом формате строка всегда имеет длину 24 символа: YYYY-MM-DDTHH:mm:ss.sssZ . Часовой пояс всегда равен нулю UTC offset, как обозначается суффикс Z

Чтобы сохранить миллисекунды, нам придется использовать объект DateTime PHP.

От строки до MongoDate :

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

Метод 1 (с использованием date_create_from_format ):

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

Способ 2 (с использованием strtotime ):

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

От MongoDate до строки :

 $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 

Надеюсь это поможет.