【问题标题】:Given a DateTime, how do I get the range of times with the same date in a particular time zone?给定一个 DateTime,如何获取特定时区中相同日期的时间范围?
【发布时间】:2011-01-10 17:47:38
【问题描述】:

我有一个代表特定日期的 DateTime 对象,如“2011-01-15 00:00:00 UTC”代表 1 月 15 日。我想生成具有相同日期的特定时区的时间范围

方法签名可能类似于

def day_range_for(date, tz)
  # ...
end

例如,如果我有range_for(DateTime.parse('2011-01-15'), 'CST'),那么我希望结果是像2011-01-15 00:00:00 -0600 .. 2011-01-15 23:59:59 -0600 这样的范围。

【问题讨论】:

  • 澄清一下;这个range_for(DateTime.parse('2011-01-15'), 'EET') 会输出什么?
  • 我认为 EET 是 UTC+2,所以应该是 ('2011-01-15 00:00:00 +0200 .. 2011-01-15 11:59:59 +0200')
  • 你的意思是23:59:59?从一天的开始到结束?

标签: ruby-on-rails ruby datetime timezone


【解决方案1】:

你能用输入字符串代替对象吗?如果您传入一个 DateTime 对象,它会有点反直觉,因为该对象表示的时间并不是您要查找的实际时间。如果您传入正确的绝对日期时间或字符串本身,它将符合我的期望。问题的实际问题完全由 ActiveSupport 处理,我认为你正在使用它,因为你用 Rails 标记了这个问题。这看起来怎么样?

def range_for(input, tz=nil)
    if tz.is_a?(String)
        tz = ActiveSupport::TimeZone.new(tz)
    else
        tz = Time.zone
    end
    if input.acts_like?(:date) || input.acts_like?(:time)
        d = input.in_time_zone(tz)
    else
        d = tz.parse(input)
    end
    return d.beginning_of_day..d.end_of_day
end

看看:

ruby-1.9.2-p0 > range_for('2011-01-15', 'Alaska')
 => Sat, 15 Jan 2011 00:00:00 AKST -09:00..Sat, 15 Jan 2011 23:59:59 AKST -09:00 
ruby-1.9.2-p0 > range_for(Time.zone.now)
 => Mon, 10 Jan 2011 00:00:00 EST -05:00..Mon, 10 Jan 2011 23:59:59 EST -05:00 
ruby-1.9.2-p0 > range_for('2011-01-15', 'EST')
 => Sat, 15 Jan 2011 00:00:00 EST -05:00..Sat, 15 Jan 2011 23:59:59 EST -05:00  

【讨论】:

  • 这看起来很合理。非常感谢!
【解决方案2】:

怎么样:

def day_range_for date, zone
  (DateTime.new(date.year,date.month,date.day,0,0,0,zone)..DateTime.new(date.year,date.month,date.day,23,59,59,zone))
end

day_range_for(DateTime.parse('2011-01-15'), 'CST')
#=> #<DateTime: 2011-01-15T00:00:00-06:00 (9822307/4,-1/4,2299161)>..#<DateTime: 2011-01-15T23:59:59-06:00 (212161917599/86400,-1/4,2299161)> 

【讨论】:

  • 我无法访问 tz 时区格式,只有 GMT 时间偏移量,例如“+5:45”。如何将偏移时间转换为 tz time_zone ?
  • @zoras:如果你指的是这个方法调用,DateTime.new 也接受'+5:45' 作为时区参数。
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多