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

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

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

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

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

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

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

0.00000000 1353305590

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

Ответ 1

Вы можете запустить функцию __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);

РЕДАКТИРОВАТЬ. Чтобы сохранить дату ISO, вам необходимо сделать следующее:

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

Ответ 2

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

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

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

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

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

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

Способ 1 (с использованием 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'));

Способ 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 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

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

Ответ 3

convert ISO date time in UTC date time here :

$timestamp = $quicky_created_date->__toString();
$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;