Как добавить 15 минут к дате в рубине только между определенными часами дня? - PullRequest
3 голосов
/ 16 марта 2012

Я полный рабочий день разработчик базы данных SQL Server, но я хочу начать использовать Ruby для определенных задач управления. Кроме того, я пытаюсь поднять свои навыки Rails на следующий уровень. Я отлично разбираюсь в SQL, но слаб в языках программирования (я прилагаю все усилия, чтобы это исправить!). Вот мой вопрос:

Я хочу написать простой цикл, который будет заполнять мою базу данных для приложения рельсов для модели встреч. Я хочу начать с даты в понедельник (скажем, 19 марта 2012 года) и хочу закончить с датой в пятницу (23 марта 2012 года). Я хочу начинать в 9 часов утра каждый день и заканчивать в 5 часов вечера каждый день. Я хочу, чтобы мои встречи проводились с 15-минутными интервалами.

В настоящее время у меня есть простой цикл, который добавляет 15 минут к анализируемому времени. Тем не менее, я хочу добавить 15 минут только между 9 утра и 5 вечера каждый день. Вот мой код:

s = Time.parse("March 19, 2012, 9:00 AM")
e = Time.parse("March 23, 2012 5:00 PM") + 15 * 60

while s < e
  puts "#{s} "
  s+=15 * 60
end

У меня есть идеальный список дат из приведенного выше кода (хотя я знаю, что, вероятно, есть гораздо лучший способ сделать это), но, как я уже сказал, я хочу ограничить свои результаты, чтобы не заполнять таблицу базы данных с кучей бесполезных дат, с которыми мне постоянно приходится иметь дело в моем приложении на Rails.

Любой совет будет принят с благодарностью. Заранее благодарю за помощь!

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Я подумал, что #step вполне подойдет для этого, затем попробовал и обнаружил, что объекты Time в Ruby не реагируют на #step, как это делают числовые.

Это хорошая идиома, поэтому я смешал ее:

MIN = 60
HR  = 60 * MIN
DAY = 24 * HR

start_date = Time.mktime(2012,3,19,0,0,0)
end_date   = Time.mktime(2012,3,23,0,0,0)

start_time =  9 * HR
end_time   = 17 * HR
interval   = 15 * MIN

module TimeStep
  def step(end_time, incr)
    t = self
    while t <= end_time
      yield t
      t += incr
    end
  end
end

start_date.extend(TimeStep).step(end_date, DAY) do |day|
  first_time = day + start_time
  first_time.extend(TimeStep).step(day+end_time, interval) do |tick|
    # make record for tick, or just print it for this example
    puts tick
  end
end

# Outputs...
Mon Mar 19 09:00:00 -0700 2012
Mon Mar 19 09:15:00 -0700 2012
Mon Mar 19 09:30:00 -0700 2012
...
Fri Mar 23 16:45:00 -0700 2012
Fri Mar 23 17:00:00 -0700 2012
1 голос
/ 16 марта 2012

Я бы сделал это так ...

Appointment.delete_all # clear table

start_date = Time.parse("March 19, 2012, 9:00 AM")
end_date = Time.parse("March 23, 2012 5:00 PM")

# create a range from start_date to end_date moving in 15 minute intervals
(start_date..end_date).step(15 * 60) do |date_time|
  # only create Appointment if the hour is in the range 9 - 17 (24 hour clock)
  Appointment.create(:appt => date_time) if (9..17) === date_time.hour
end

Альтернативная версия для рубина 1.9.3

curr_time = start_date
begin
  Appointment.create(:appt => curr_time) if (9..17) === curr_time.hour     
end while (curr_time += 60 * 15) <= end_date

РЕДАКТИРОВАТЬ: Это работает для меня.

irb(main):003:0> require 'time'
=> true
irb(main):004:0> start_date = Time.parse("March 19, 2012, 9:00 AM")
=> Mon Mar 19 09:00:00 -0400 2012
irb(main):005:0> end_date = Time.parse("March 23, 2012 5:00 PM")
=> Fri Mar 23 17:00:00 -0400 2012
irb(main):006:0> (start_date..end_date).step(15 * 60) do |date_time|
irb(main):007:1* puts date_time
irb(main):008:1> end
Mon Mar 19 09:00:00 -0400 2012
Mon Mar 19 09:15:00 -0400 2012
Mon Mar 19 09:30:00 -0400 2012
Mon Mar 19 09:45:00 -0400 2012
Mon Mar 19 10:00:00 -0400 2012
Mon Mar 19 10:15:00 -0400 2012
Mon Mar 19 10:30:00 -0400 2012
.
.
.
Fri Mar 23 15:45:00 -0400 2012
Fri Mar 23 16:00:00 -0400 2012
Fri Mar 23 16:15:00 -0400 2012
Fri Mar 23 16:30:00 -0400 2012
Fri Mar 23 16:45:00 -0400 2012
Fri Mar 23 17:00:00 -0400 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...