PHP Velho Oeste 2024

La classe MongoDate

(PECL mongo >=0.8.1)

Avertissement

Cette extension, qui définie cette classe est obsolète. Veuillez utiliser l'extension MongoDB à la place. Les alertnatives à cette classe sont :

Introduction

Représente un objet date pour la base. Cette classe peut être utilisée pour sauvegarder des dates dans la base de données mais aussi pour faire des requêtes à base de dates. Par exemple :

Exemple #1 Stockage des dates avec MongoDate

<?php

// Sauvegarde une date dans la base de données
$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"));

// Trouve les dates entre 1/15/2010 et 1/30/2010
$collection->find(array("ts" => array('$gt' => $start'$lte' => $end)));

?>

MongoDB stocke les dates en millisecondes après epoch. Ceci signifie que les dates ne contiennent pas d'informations sur les fuseaux horaires. Les fuseaux doivent être stockés dans un champ séparé si besoin. Aussi, toute précision au delà de la milliseconde sera perdue lorsque le document est envoyé dans la base ou restauré de celle-ci.

Synopsis de la classe

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

Sommaire

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