0

Mongoid を使用して DateTime フィールドを MongoDB に格納すると、奇妙な問題が発生します。Ruby 側から見ると、問題ないように見えます。

irb(main):002:0> dt=DateTime.strptime("12/02/13 13:25:21", "%m/%d/%Y %H:%M:%S")
=> #<DateTime: 0013-12-02T13:25:21+00:00 ((1726142j,48321s,0n),+0s,2299161j)>


irb(main):003:0> dt.day
=> 2
irb(main):004:0> dt.month
=> 12
irb(main):005:0> dt.year
=> 13
irb(main):006:0> dt.hour
=> 13
irb(main):007:0> dt.minute
=> 25
irb(main):008:0> dt.second
=> 21

これを Mongoid を使用して MongoDB に保存すると、次のように保存されます。

class Foo
  include Mongoid::Document
  include Mongoid::Timestamps

  field :datetime, type: DateTime

  def set_stuff_up
    self.datetime = DateTime.strptime("12/02/13 13:25:21", "%m/%d/%Y %H:%M:%S")
  end
end

これをデータベースから取得すると、ここで問題が発生します。

> db.foos.findOne().datetime
ISODate("0013-11-30T13:25:21Z")
> db.foos.findOne().datetime.getMonth()
10
> db.foos.findOne().datetime.getDay()
6
> db.foos.findOne().datetime.getYear()
-1887

結果は、Ruby 側でも同様に偏っています。findOne()ちなみに、コレクションにはドキュメントが 1 つしかないため、ここでドキュメントを取得するために使用しても問題ありません。

> db.foos.find().size()
1
4

1 に答える 1

1

その日付形式に間違った形式文字列を使用しています。A%Yは 4 桁の年、%yは 2 桁の年です。細かいマニュアルから:

%Y - Year with century (can be negative, 4 digits at least)
        -0001, 0000, 1995, 2009, 14292, etc.
...
%y - year % 100 (00..99)

コンソールで年が正しくないこともわかります。

=> #<DateTime: 0013-12-02T13:25:21+00:00 ((1726142j,48321s,0n),+0s,2299161j)>

dt.year:

irb(main):005:0> dt.year
=> 13

0013 と 2013 はまったく同じではありません。

あなたは言いたい:

self.datetime = DateTime.strptime("12/02/13 13:25:21", "%m/%d/%y %H:%M:%S")
# ------------------------------------------------------------^^
于 2013-08-29T23:24:46.307 に答える