PHP Conference Japan 2024

MongoDB\BSON\UTCDateTime 类

(mongodb >=1.0.0)

简介

表示» BSON 日期。该值是一个 64 位整数,表示自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数。负值表示 1970 年之前的日期。

类概要

final class MongoDB\BSON\UTCDateTime implements MongoDB\BSON\UTCDateTimeInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable {
/* 方法 */
final public jsonSerialize(): mixed
final public serialize(): string
final public toDateTime(): DateTime
final public __toString(): string
final public unserialize(string $data): void
}

变更日志

版本 描述
PECL mongodb 1.12.0 实现 Stringable 用于 PHP 8.0+。
PECL mongodb 1.3.0 实现 MongoDB\BSON\UTCDateTimeInterface
PECL mongodb 1.2.0 实现 SerializableJsonSerializable

目录

添加注释

用户贡献的注释 3 条注释

Stephen
6 年前
使用 MongoDB\BSON\UTCDateTime 进行查询时,请确保对于 strtotime 的实例,您将构造函数以毫秒为单位

$start = new MongoDB\BSON\UTCDateTime(strtotime("midnight") * 1000);
$filter = ['date' => ['$gte' => $start]];
$options = ['sort' => ['date' => -1]];
$query = new MongoDB\Driver\Query($filter,$options);
mark at DONTSPAM dot moderndeveloperllc dot com
8 年前
如果您需要微秒精度,请谨慎使用 UTCDateTime,因为此类仅将时间存储到_毫秒_。如果您需要完整的精度,则需要将日期作为字符串存储在 MongoDB 中。将 DateTime 转换为浮点数也可能导致精度丢失。

查看差异的一种简单方法是使用

代码
var_dump(
(new DateTime)->format('U.u'),
(float) (new DateTime)->format('U.u'),
(new MongoDB\BSON\UTCDateTime())->toDateTime()->format('U.u')
);

输出
string(17) "1477534060.918415"
double(1477534060.9185)
string(17) "1477534060.918000"

注意:从 PHP 7.1.0 RC4 开始,修复了许多与 DateTimeInterface 类相关的微秒格式错误。以上代码来自 PHP 7.1.0 RC5 和 mongodb 1.2.0alpha3。1.2.0 版本的扩展添加了在不传递整数毫秒的情况下实例化此类的方法。
mike at brenden dot com
6 年前
来源 [url]https://github.com/mongodb/mongo-php-driver/issues/187[/url]

MichaelBrenden --

两个 Mongo 驱动程序如何确定它们是否可以将某些内容转换为 ISODate 格式?

mongo.so 是否需要 MongoDate 的类类型,或者它是否通过 __toString() 返回的数据(即“0.12345678 1234567890”)来确定?

mongodb.so 是否需要 \MongoDB\BSON\UTCDateTime 的类类型,或者它是否通过 __toString() 返回的数据(即“1234567890123”)来确定?

jmikola --

>> ISODate 格式?

记录在案,ISODate 只是 mongo shell 中的辅助函数。在 BSON 规范中,实际的 BSON 类型是 0x09,最好称为“UTC 日期时间”。
[url]https://docs.mongodb.com/manual/core/shell-types/#return-date[/url]
[url]http://bsonspec.org/spec.html[/url]

>> mongodb.so 是否需要 \MongoDB\BSON\UTCDateTime 的类类型,或者它是否通过 __toString() 返回的数据(即“1234567890123”)来确定?

驱动程序需要 MongoDB\BSON\UTCDateTime 对象才能编码 BSON 日期类型。如果您想知道,BSON 编码期间的相关 instanceof 检查在这里。__toString() 函数纯粹是为了方便用户端应用程序而存在的。驱动程序在测试之外不会使用它。
[url]https://github.com/mongodb/mongo-php-driver/blob/1.3.4/src/bson-encode.c#L215[/url]

旧版 mongo.so 驱动程序与此类似,因为它需要 MongoDate 对象才能编码 BSON 日期类型(相关代码在这里)。
[url]https://github.com/mongodb/mongo-php-driver-legacy/blob/1.6.16/bson.c#L273[/url]
To Top