For showing a human readable MongoDate, you can use something like this:
<?php
date('Y-M-d h:i:s', $yourDate->sec);
?>
(PECL mongo >=0.8.1)
Расширение, задающее этот класс, объявлено устаревшим. Вместо него используйте расширение MongoDB. Есть такие альтернативы:
Представляет объекты даты для базы данных. Этот класс следует использовать для сохранения дат в базе данных и для запроса дат. Например:
Пример #1 Сохранение даты с MongoDate
<?php
// сохраняем дату в базе данных
$collection->save(array("ts" => new MongoDate()));
$start = new MongoDate(strtotime("2010-01-15 00:00:00"));
$end = new MongoDate(strtotime("2010-01-30 00:00:00"));
// находим даты между 1/15/2010 и 1/30/2010
$collection->find(array("ts" => array('$gt' => $start, '$lte' => $end)));
?>
MongoDB хранит даты в миллисекундах после эпохи Unix (Unix-время). Это значит, что даты не содержат информацию о часовом поясе. Часовые пояса должны храниться в отдельном поле, если это необходимо. Во-вторых, это означает, что любая точность, превышающая миллисекунды, будет потеряна при отправке документа в/из базы данных.
For showing a human readable MongoDate, you can use something like this:
<?php
date('Y-M-d h:i:s', $yourDate->sec);
?>
This extension is deprecated, but some people still have to use it.
Please, note that properties (sec, usec) are read-only.
You have to do something like this:
<?php
$d = new \MongoDate();
echo "\n" . $d->toDateTime()->format(\DateTime::ISO8601);
// move to future for 125 seconds
$d = new \MongoDate($d->sec + 125, $d->usec);
echo "\n" . $d->toDateTime()->format(\DateTime::ISO8601);
?>
MichaelBrenden --
How do the two Mongo drivers determine if they can translate something into the ISODate format?
Does mongo.so require a class type of MongoDate, or does it determine by data returned by __toString() (i.e., "0.12345678 1234567890")?
Does mongodb.so require a class type of \MongoDB\BSON\UTCDateTime, or does it determine by data returned by __toString() (i.e., "1234567890123")?
jmikola
>> the ISODate format?
For the record, ISODate is just a helper function in the mongo shell. The actual BSON type is 0x09 in the BSON spec and is best referred to as "UTC date time".
[url]https://docs.mongodb.com/manual/core/shell-types/#return-date[/url]
[url]http://bsonspec.org/spec.html[/url]
>> Does mongodb.so require a class type of \MongoDB\BSON\UTCDateTime, or does it determine by data returned by __toString() (i.e., "1234567890123")?
The driver requires a MongoDB\BSON\UTCDateTime object in order to encode a BSON date type. The relevant instanceof check during BSON encoding is here if you care to see it. The __toString() function exists purely as a convenience for userland applications. The driver does not use it outside of tests.
[url]https://github.com/mongodb/mongo-php-driver/blob/1.3.4/src/bson-encode.c#L215[/url]
The legacy mongo.so driver is similar in that it requires a MongoDate object in order to encode a BSON date type (relevant code is here).
[url]https://github.com/mongodb/mongo-php-driver-legacy/blob/1.6.16/bson.c#L273[/url]
I wanted a way to check the age of a record. This code will calculate the time between the creation date of the record, and return the seconds. I use it for caching pages similar to the max-age header in a browser. If the record is older, than my limit it deletes itself.
<?php
function microtime_diff( $start, $end=NULL ) {
if( !$end ) {
$end= microtime();
}
list($start_usec, $start_sec) = explode(" ", $start);
list($end_usec, $end_sec) = explode(" ", $end);
$diff_sec= intval($end_sec) - intval($start_sec);
$diff_usec= floatval($end_usec) - floatval($start_usec);
return floatval( $diff_sec ) + $diff_usec;
}
microtime_diff($cache['stamp']->sec);
?>