このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

MongoDBの日時

MongoDBの日時(date型)は、UNIXエポックからのミリ秒だそうです。
http://docs.mongodb.org/manual/reference/bson-types/#date より:

the number of milliseconds since the Unix epoch (Jan 1, 1970).

ミリ秒はちょっと珍しいかな。UNIXエポックからの秒ならよく使われていて、たとえばこのはてなダイアリーのエントリーIDがそうです。この値は、コマンドラインから次のようにして確認することもできます。


$ date +%s
1381302493

表示された値(秒単位)に000を付ければMongoDBのdate型になります。mongoimportmongoexportで使う特殊なJSON形式なら、次のように予約フィールド名$dataを使って日時を表すことができます。


{"$date": 1381302493000}

この日時は64ビット整数なので、保存するときのサイズが小さいメリットがあります。また、数の大小比較で日時の順序を判断できるし、未来や過去を求めるのも足し算・引き算で済みます。しかし、人間が見てもサッパリわかりません。人間可読な標準的な日時の表現はISO 8601で規定されています。

http://www.w3.org/TR/NOTE-datetime に 1997-07-16T19:20:30.45+01:00 という例が出ているので、秒の小数点がもう一桁増えた 1997-07-16T19:20:30.453+01:00 も許容でしょう。つまり、ミリ秒まで書きたいならそうできます。

人間には文字列が都合がいいのですが、プログラムが年や月など日時の構成素にアクセスするときは構造的データになっているほうが便利です。それをCatyのスキーマで書けば次のような感じでしょうかね。


type DatetimeStruct = {
"year": integer,
"month": integer(minimum=1, maximum=12),
"day": integer(minimum=1, maximum=31), // 月により最大値は変動する
"hour": integer(minimum=0, maximum=23),
"minute": integer(minimum=0, maximum=59),
"second": integer(minimum=0, maximum=59),
"milisecond": integer(minimum=0, maximum=999),
"utcOffset": [integer, integer]
};

タイムゾーンは、名前よりUTC offsetのほうが確実だと思います。例えば、日本標準時JST)は UTC+9:00 なので、 "utcOffset": [9, 0] となります。

なお、MongoDBにはtimestampというデータ型もありますが、http://docs.mongodb.org/manual/reference/bson-types/#timestamps によると:

for internal MongoDB use

なので、ユーザーが直接使用することはないでしょう。