Я хочу сохранить текущую дату, сгенерированную 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
Надеюсь это поможет.