0

tl;dr:使用日期、时间和日期时间的规则是什么,这样我才能确保我的应用程序的一致性?

我试图在 Rails 中使用 Dates & Times & Zones,所以当我真的希望所有“面向用户”的日期/时间都针对时区进行调整时,我不会意外使用 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 将原样返回,因为没有干净的方法将其映射到 Time。

那么从 Rails 中获得一致的日期和时间的“规则”是什么?

4

1 回答 1

1

我假设您start_at的数据库中有一个列。结果e.start_at不是 的实例,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 
于 2012-08-23T20:12:48.047 回答