Диапазон DateTime с другим разрешением, чем один день - PullRequest
1 голос
/ 24 июля 2010

как я могу получить список объектов DateTime, которые соответствуют следующим критериям:

  • они между двумя экземплярами DateTime
  • они падают на долю часа / мин. например. они целые четверть часа

при активной поддержке возможное решение:

(my_datetime_ob_a.to_i .. my_datetime_ob_b.to_i).each { |timestamp|
  puts timestamp if (timestamp % (3600/4) == 0)
}

это нехорошо: слишком много итераций и слишком много преобразований (вам нужно преобразовать метку времени в объект DateTime.

Ответы [ 2 ]

5 голосов
/ 24 июля 2010

Если вы используете 1.9, вы можете использовать Date#step следующим образом:

require 'date'
t1 = DateTime.now
t2 = t1+3 # three days from now
# 0.25 being 1/4 of a day - 6 hours
p t1.step(t2, 0.25).to_a
#=>[#<DateTime: 2010-07-24T21:49:38+02:00 (7857287443636107/3200000000,1/12,2299161)>, #<DateTime: 2010-07-25T03:49:38+02:00 (2455402.57613628,1/12,2299161)>, #<DateTime: 2010-07-25T09:49:38+02:00 (2455402.82613628,1/12,2299161)>, #<DateTime: 2010-07-25T15:49:38+02:00 (2455403.07613628,1/12,2299161)>, #<DateTime: 2010-07-25T21:49:38+02:00 (2455403.32613628,1/12,2299161)>, #<DateTime: 2010-07-26T03:49:38+02:00 (2455403.57613628,1/12,2299161)>, #<DateTime: 2010-07-26T09:49:38+02:00 (2455403.82613628,1/12,2299161)>, #<DateTime: 2010-07-26T15:49:38+02:00 (2455404.07613628,1/12,2299161)>, #<DateTime: 2010-07-26T21:49:38+02:00 (2455404.32613628,1/12,2299161)>, #<DateTime: 2010-07-27T03:49:38+02:00 (2455404.57613628,1/12,2299161)>, #<DateTime: 2010-07-27T09:49:38+02:00 (2455404.82613628,1/12,2299161)>, #<DateTime: 2010-07-27T15:49:38+02:00 (2455405.07613628,1/12,2299161)>, #<DateTime: 2010-07-27T21:49:38+02:00 (2455405.32613628,1/12,2299161)>]
1 голос
/ 24 июля 2010

Вот альтернативный подход:

  • Найти первую метку времени> = my_datetime_ob_a, что составляет целые четверть часа (т. Е. С интервалом до 15 минут)
  • Пока эта отметка времени <= <code>my_datetime_ob_b, поместите ее в свой список, добавьте 15 минут и выполните цикл

Реализация:

def round_to_quarter_hour(datetime)
  secs_past_quarter_hour = datetime.to_i % 15.minutes
  if secs_past_quarter_hour == 0
    datetime
  else
    secs_to_advance_to_next_quarter_hour = 15.minutes - 
      secs_past_quarter_hour
    datetime.advance :seconds => secs_to_advance_to_next_quarter_hour
  end
end

def quarter_hours_between(datetime_a, datetime_b)
  results = []
  datetime = round_to_quarter_hour(datetime_a)
  while datetime <= datetime_b
    results << datetime
    datetime = datetime.advance :minutes => 15
  end
  results
end

Пример:

>> d1
=> Sat, 24 Jul 2010 17:28:06 +0100
>> d2
=> Sat, 24 Jul 2010 18:03:00 +0100
>> quarter_hours_between(d1, d2)
=> [Sat, 24 Jul 2010 17:30:00 +0100, Sat, 24 Jul 2010 17:45:00 +0100,
Sat, 24 Jul 2010 18:00:00 +0100]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...