具有时区校正的MongoDate聚合

时间:2014-03-10 02:52:27

标签: php mongodb

我使用聚合组功能生成按日期,月份和年份细分的订单报告。我的日期存储在UTC中的MongoDate object

'$group' => array (
    '_id' => array (

        'year' => array ( '$year' => '$created' ),
        'month' => array ( '$month' => '$created' ),
        'day' => array ( '$dayOfMonth' => '$created' ),

    )
)

我尝试使用项目添加到日期对象,但似乎我无法添加到MongoDate对象。 (如下所示:https://stackoverflow.com/a/18854229/1069277

'$project' => array (

    'created' => array (

        '$add' => array (

            '$created' => 8 * 60 * 60 * 1000

        )

    )

)

添加另一个存储时区的字段是否已经纠正了此时实现此目的的唯一方法?

1 个答案:

答案 0 :(得分:0)

我可以继续使用聚合中的date operators并进行日期数学运算,以便将其更改为时间戳值(这是引用的答案所做的,而不是BSON日期)但是冗长而低效。

您真正想要做的是在代码中进行转换并传入MongoDate类型。

以下是一些需要考虑的往返代码:

date_default_timezone_set('UTC');

$dt = new DateTime("2014-02-01", new DateTimeZone('PST'));
echo var_dump( $dt );

echo $dt->getTimestamp(), "\n";

$mongo = new MongoDate( $dt->getTimestamp() );

echo var_dump( $mongo );

echo $mongo->sec, "\n";

$new = new DateTime( date('Y-m-d', $mongo->sec ), new DateTimeZone('PST'));

echo var_dump ($new);

因此,无论您是传递值还是使用结果,只需在代码中进行转换即可。这样更好。