PHP Velho Oeste 2024

La clase MongoDate

(PECL mongo >=0.8.1)

Advertencia

Esta extensión que define esta clase está obsoleta. En su lugar debe usarse la extensión MongoDB. Las alternativas a esta clase son:

Introducción

Representa objetos de tipo fecha para la base de datos. Esta clase debe usarse para almacenar fechas en la base de datos y para consultarlas. Por ejemplo:

Ejemplo #1 Almacenar datos con MongoDate

<?php

// guardar una fecha en base de datos
$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"));

// encontrar fechas entre 1/15/2010 y 1/30/2010
$collection->find(array("ts" => array('$gt' => $start'$lte' => $end)));

?>

MongoDB almacena fechas en milisegundos tras la fecha de referencia. Esto significa que las fechas no contienen información de zonas horarias. Si fuera necesario, la zona horaria deberá ser almacenada en otro campo. Además, esto significa que cualquier nivel de precisión más allá de milisegundos se perderá al leer o escribir en la base de datos.

Sinopsis de la Clase

MongoDate {
/* Campos */
public int $sec ;
public int $usec ;
/* Métodos */
public __construct ([ int $sec = time() [, int $usec = 0 ]] )
public toDateTime ( void ) : DateTime
public __toString ( void ) : string
}

Tabla de contenidos

add a note add a note

User Contributed Notes 4 notes

up
17
jhonnydcano at yahoo dot com
14 years ago
For showing a human readable MongoDate, you can use something like this:

<?php
date
('Y-M-d h:i:s', $yourDate->sec);
?>
up
1
Philipp
7 years ago
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);

?>
up
-1
mike at brenden dot com
6 years ago
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]
up
-44
richard at securebucket dot com
12 years ago
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);
?>
To Top