0

昨日、MongoDB で奇妙な体験をしました。私はツイストとtxmongoを使用しています - mongodb の非同期ドライバー (pymongo に似ています)。

データを受信して​​mongodbに入れるレストサービスがあります。1 つのフィールドはミリ秒単位の 13 桁のタイムスタンプです。

まず第一に、Pythonでミリ秒のタイムスタンプをPythonの日時に変換する簡単な方法はありません。私はこのようなものになりました:

def date2ts(ts):
    return int((time.mktime(ts.timetuple()) * 1000) + (ts.microsecond / 1000))


def ts2date(ts):
    return datetime.datetime.fromtimestamp(ts / 1000) + datetime.timedelta(microseconds=(ts % 1000))

問題は、データをmongodbに保存し、datetimeを取得して、関数を使用してtimestampに戻すと、ミリ秒単位で同じ結果が得られないことです。

なぜそれが起こっているのか理解できませんでした。Datetime は ISODate オブジェクトとして mongodb に保存されます。シェルからクエリを実行しようとしましたが、実際には 1 秒または数ミリ秒の違いがあります。

質問 1: なぜこれが起こっているのか誰か知っていますか?

しかし、これで終わりではありません。datetime を使用せず、タイムスタンプをできるだけ長く保存することにしました。その前に、コレクションからすべてのデータを削除しました。同じフィールドを日付ではなく長さだけ保存しようとすると、シェルでISODateとして表されることに非常に驚きました。そして、取得すると、まだ数ミリ秒の違いがありました.

コレクションとインデックスを削除しようとしました。役に立たなかったとき、データベース全体を削除しようとしました。役に立たなかったとき、データベース全体を削除してmongodを再起動しようとしました。そして、この後、Longとして保存し始めたと思います。

質問 2: なぜこれが起こっているのか誰か知っていますか?

ありがとうございました!

4

2 に答える 2

0

異なるタイムゾーンの場合があります。以下の機能を使用して修正してください。

function time_format(d, offset) {
    // Set timezone
    utc = d.getTime() + (d.getTimezoneOffset() * 60000);
    nd = new Date(utc + (3600000*offset));
    return nd;
}

searchdate = time_format(searchdate, '+5.5');

ここでの「+5.5」は、現地時間から GMT 時間までのタイムゾーンの差です。

于 2012-06-28T09:31:10.873 に答える
0

Python のタイムスタンプは、1970 年 1 月 1 日の Unix エポックからの秒数で計算されます。一方、JavaScript (および MongoDB) のタイムスタンプはミリ秒単位です。

つまり、タイムスタンプしか手元にない場合は、Python 値を 1000 倍してミリ秒を取得し、その値を MongoDB に格納できます。同様に、MongoDB から値を取得し、それを 1000 で割って Python タイムスタンプにすることができます。Python は、小数点以下 3 桁ではなく 2 桁の有効桁数しか考慮していないように見えることに注意してください (通常、ミリ秒は考慮されないため)。

通常は代わりにタプルを使用することをお勧めしますが、値の範囲の規則は言語ごとに異なり (JavaScript は月の日付が 1 ではなく 0 で始まるという点で直感的ではありません)、将来的に問題が発生する可能性があります。

于 2012-06-16T23:52:24.897 に答える