Rails:如何在特定时区创建Time对象

时间:2012-05-04 09:33:53

标签: ruby-on-rails ruby datetime timezone tzinfo

我的应用正在“莫斯科”(+04:00)时区工作。但有时我需要只在当地时间创建时间对象(例如“01 may 2012 13:45”)和ActiveSupport :: TimeZone对象的名称(例如“柏林”:夏令时+02:00和+01: 00否则)。

例如,如果我得到“01 may 2012 13:45”和“Berlin”作为输入我想要收获“2012-05-01 13:45:00 +0200”或“2012-05-01 11:45 :00 +0000“。我创建了以下功能:

def from_local_datetime(local_datetime, time_zone)
  offset = Time.now.in_time_zone(time_zone).formatted_offset
  datetime = case local_datetime
  when String
    DateTime.parse(local_datetime)
  else
    DateTime.new(local_datetime)
  end.change(:offset => offset)

  return datetime
end

初看起来它按预期工作。但这是否是这类任务的最佳实践?在某些情况下可能会出错。我不太确定。

我会对任何评论都很满意。

UPD:我认为在DST更改时间的时候可能会出现错误。例如,2011年3月26日是柏林时区的GMT + 1,Time.now.in_time_zone("Berlin").formatted_offset返回“GMT + 1”,但2011年3月27日将是GMT + 2.所以如果我在3月27日之前致电from_local_datetime("28 march 2011", "Berlin")它会返回28 march 2011 00:00:00 +0100,但如果我在更改时间之后调用它,我的函数将返回28 march 2011 00:00:00 +0200 :(

2 个答案:

答案 0 :(得分:0)

您的转换方法是正确的方法。

对于网站,您应确保将时间存储为数据库中的UTC。如果您可以从数据库中获取UTC值,而不是本地时间(或者您可以将Web服务器的时区设置为UTC),则无需将时间从UTC转换为本地时间然后将其转换为用户的时区。

当然,您必须存储用户的时区偏好。

答案 1 :(得分:0)

TZInfo::Timezone.get('Europe/London')

查找时区

http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html