24

日付オブジェクトを UTC で保存する MongoDB があります。さて、別のタイムゾーン(CET)で年月日ごとに集計を行いたいと思います。

これを行うと、UTC で正常に動作します。

    BasicDBObject group_id = new BasicDBObject("_id", new BasicDBObject("year", new BasicDBObject("$year", "$tDate")).
                append("month", new BasicDBObject("$month", "$tDate")).
                append("day", new BasicDBObject("$dayOfMonth", "$tDate")).
                append("customer", "$customer"));

    BasicDBObject groupFields = group_id.
            append("eventCnt", new BasicDBObject("$sum", "$eventCnt")); 

    BasicDBObject group = new BasicDBObject("$group", groupFields);

または、コマンドラインを使用する場合 (テストされていません。私は Java バージョンのみをテストしました):

{
    $group: {
        _id: {
            "year": {
                "$year", "$tDate"
            },
            "month": {
                "$month", "$tDate"
            },
            "day": {
                "$dayOfMonth", "$tDate"
            },
            "customer": "$customer"
        },
        "eventCount": {
            "$sum": "$eventCount"
        }
    }
}

集計フレームワーク内でこれらの日付を CET に変換するにはどうすればよいですか?

たとえば、「2013-09-16 23:45:00 UTC」は「2013-09-17 00:45:00 CET」で、これは別の日です。

4

8 に答える 8

16

私は CET とその UTC との関係の専門家ではありませんが、次のコード (シェル用) は MongoDB 日付型への適切な変換 (1 時間を追加) を行う必要があります。

db.dates.aggregate(
  {$project: {"tDate":{$add: ["$tDate", 60*60*1000]}, "eventCount":1, "customer":1}}
)

パイプラインの残りの部分の前にそのプロジェクト コマンドを実行すると、結果は CET になります。

于 2013-09-17T15:43:57.813 に答える
4

たとえば moment.js を使用して、CET の現在のタイムゾーン オフセットを決定しますが、この方法で夏と冬のオフセットを取得します

var offsetCETmillisec = moment.tz.zone('Europe/Berlin').offset(moment())* 60 * 1000;

  $group: {
    _id: {
      'year': {'$year': [{ $subtract: [ '$createdAt', offsetCETmillisec ]}] },
      'month': {'$month': [{ $subtract: [ '$createdAt', offsetCETmillisec ]}] },
      'day': {'$dayOfMonth': [{ $subtract: [ '$createdAt', offsetCETmillisec ]}] }
    },
    count: {$sum: 1}
  }
}
于 2016-09-10T08:30:57.110 に答える
1

タイムゾーンを使用したソリューションは優れたソリューションですが、バージョン 3.6 では、タイムゾーンを使用して出力をフォーマットすることもできるため、すぐに使用できる結果が得られます。

{
"$project":{
    "year_month_day": {"$dateToString": { "format": "%Y-%m-%d", "date": "$tDate", "timezone": "America/Chicago"}}
},
"$group":{
    "_id": "$year_month_day",
    "count":{"$sum":1}
}
}

「$match」がタイムゾーンも考慮していることを確認してください。そうしないと、間違った結果が得られます。

于 2019-03-17T14:13:16.803 に答える
-10
<?php
    date_default_timezone_set('Asia/Karachi');
    $date=getdate(date("U"));
    $day = $date['mday'];
    $month =$date['mon'];
    $year = $date['year'];
    $currentDate = $year.'-'.$month.'-'.$day;
?>
于 2013-09-17T14:08:37.980 に答える