开发者

Given a DateTime, how do I get the range of times with the same date in a particular time zone?

I have a DateTime object representing a particular date, as in "2011-01-15 00:00:00 UTC" to represent January 15th. I would like to produce the range of times in a particular time zone that have the same date.

The method signature would probably be so开发者_Go百科mething like

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

For example, if I have range_for(DateTime.parse('2011-01-15'), 'CST'), then I want the result to be a range like 2011-01-15 00:00:00 -0600 .. 2011-01-15 23:59:59 -0600.


Can you take the input string instead of the object? If you pass in a DateTime object, its a tad counter intuitive because the time the object represents isn't the actual time you are looking for. It would conform to my expectations if you either passed in the correct, absolute DateTime, or the string itself. The actual meat of the problem is entirely handled by ActiveSupport, which I think you are using since you tagged this question with Rails. How does this look?

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

Have a look:

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  


How about:

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)> 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜