tl;dr:使用Date、Time和amp;日期时间,这样我就可以确保应用程序的一致性?
我正试着用Dates&时代&Rails中的区域,这样当我真的想根据时区调整所有"面向用户"的日期/时间时,我就不会意外地使用UTC。至少在我看来,我注意到了一些不一致的地方,我希望理解它们背后的规则或逻辑,这样我就不会再次感到"惊讶"。
1.9.3p194 :028 > e = Event.find(1)
Event Load (0.3ms) SELECT "events".* FROM "events" WHERE "events"."id" = $1 LIMIT 1 [["id", 1]]
=> #<Event id: 1, start_at: "2012-08-27 19:15:00", end_at: "2012-08-27 21:00:00", created_at: "2012-08-22 07:43:31", updated_at: "2012-08-23 03:01:59">
1.9.3p194 :037 > e.start_at # <== start_at is DateTime in model
=> Mon, 27 Aug 2012 12:15:00 PDT -07:00
1.9.3p194 :036 > e.start_at.to_time
=> 2012-08-27 19:15:00 UTC ### <=== This is in UTC.. ok...
1.9.3p194 :034 > DateTime.now
=> Thu, 23 Aug 2012 10:44:16 -0700 # <=== Also a DateTime
1.9.3p194 :035 > DateTime.now.to_time
=> Thu, 23 Aug 2012 10:44:19 -0700 ### <=== But this is in Pacific Time ?!?
2种不同于to_time
的反应?还是我错过了什么?
DateTime的to_time的相当神秘的文档没有提到时区:
to_time()尝试将self转换为Ruby Time对象;如果超出Ruby Time类的范围,则返回self。如果self的偏移量不是0,那么self将被原封不动地返回,因为没有干净的方法将其映射到时间。
那么,获得一致日期的"规则"是什么;Rails超时?
我假设您的数据库中有一个start_at
列。结果CCD_ 3不是DateTime
的实例而是Time
的实例。(尝试调用e.start_at.class
查看)
与其使用DateTime.now
,我建议使用Rails的Time.zone.now
,它将返回Time.zone
中定义的时区中的当前时间。
1.9.3p125 :005 > Time.zone
=> (GMT+00:00) UTC
1.9.3p125 :006 > Time.zone.now
=> Thu, 23 Aug 2012 20:10:34 UTC +00:00
1.9.3p125 :007 > Time.zone = "Berlin"
=> "Berlin"
1.9.3p125 :008 > Time.zone
=> (GMT+01:00) Berlin
1.9.3p125 :009 > Time.zone.now
=> Thu, 23 Aug 2012 22:10:47 CEST +02:00