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

в основном я хотел бы получить случайное datetime в течение последнего года:

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

3 ответов


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

rand(1.year).ago.beginning_of_hour

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


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

(DateTime.now + 30.minutes).beginning_of_hour

Не ответ на фактический вопрос, но он отвечает на название вопроса (именно так я попал сюда).


попробуйте это:

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. :)