Учитывая DateTime, как я могу получить диапазон времени с той же датой в определенном часовом поясе? - PullRequest
4 голосов
/ 10 января 2011

У меня есть объект DateTime, представляющий конкретную дату, как в «2011-01-15 00:00:00 UTC» для представления 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.

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Можете ли вы взять входную строку вместо объекта? Если вы передаете объект DateTime, его счетчик немного интуитивно понятен, потому что время, которое представляет объект, не является фактическим временем, которое вы ищете. Это будет соответствовать моим ожиданиям, если вы передадите либо правильный, абсолютный 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  
0 голосов
/ 10 января 2011

Как насчет:

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)> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...