Как получить случайный DateTime, округленный до начала часа в Rails?

В принципе, я хотел бы получить случайное дата-время в течение прошлого года:

rand(1.year).ago  #=> Sun, 22 Sep 2013 18:37:44 UTC +00:00 (example)

Но как я могу определить или ограничить это временем в час? Например:

Sun, 22 Sep 2013 18:00:00 UTC +00:00
Sat, 02 Nov 2013 10:00:00 UTC +00:00
Fri, 12 Apr 2013 21:00:00 UTC +00:00

Ответ 1

Наконец-то я нашел то, что искал. @Stoic ответ очень хороший, но я нашел этот доступный метод (http://api.rubyonrails.org/classes/DateTime.html):

rand(1.year).ago.beginning_of_hour

Точно одно и то же, но выглядит аккуратно и мешает вам писать свою собственную функцию.

Ответ 2

Округление datetime до ближайшего часа в Rails будет

(DateTime.now + 30.minutes).beginning_of_hour

Не ответ на реальный вопрос, но он отвечает на заголовок вопроса (вот как я сюда попал).

Ответ 3

Попробуйте следующее:

def random_time_to_nearest_hour
  time = rand(1.year).ago
  time - time.sec - 60 * time.min
end

Примеры:

[1] pry(main)> random_time_to_nearest_hour
=> Sun, 28 Apr 2013 16:00:00 UTC +00:00
[2] pry(main)> random_time_to_nearest_hour
=> Sat, 08 Jun 2013 15:00:00 UTC +00:00
[3] pry(main)> random_time_to_nearest_hour
=> Thu, 22 Aug 2013 23:00:00 UTC +00:00
[4] pry(main)> random_time_to_nearest_hour
=> Tue, 29 Jan 2013 14:00:00 UTC +00:00
[5] pry(main)> random_time_to_nearest_hour
=> Tue, 13 Aug 2013 06:00:00 UTC +00:00
[6] pry(main)> random_time_to_nearest_hour
=> Mon, 03 Jun 2013 08:00:00 UTC +00:00
[7] pry(main)>

Обратите внимание, что этот метод всегда будет floor до ближайшего часа, но поскольку вы произвольно генерируете случайное время, не имеет значения, получает ли это время floor'ed вниз или получает round'ed.:)