Rails:Date/Time、to_Time和时区的澄清(经验法则?)



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 

相关内容

  • 没有找到相关文章

最新更新