Как вернуть формат даты 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;