【问题标题】:How do get a random DateTime rounded to beginning of hour in Rails?如何在 Rails 中将随机 DateTime 四舍五入到小时的开始?
【发布时间】:2013-12-27 18:03:03
【问题描述】:

基本上我想在去年得到一个随机的日期时间:

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

【问题讨论】:

  • 您的意思是要确保生成的随机时间是准确的钟点钟声?
  • 是的。或者我将这些时间四舍五入到最接近的小时。

标签: ruby-on-rails ruby date datetime


【解决方案1】:

我终于找到了我要找的东西。 @Stoic 的回答很好但是我发现了这个可用的方法(http://api.rubyonrails.org/classes/DateTime.html):

rand(1.year).ago.beginning_of_hour

做同样的事情,但看起来更整洁,让您不必编写自己的函数。

【讨论】:

  • 真的很好 :) 不知道 beginnning_of_* 方法的存在。
  • 在 ruby​​ 2.1.2 中不推荐在号码上调用#ago。现在使用rand(1.year).seconds.ago.beginning_of_hour
  • @andorov ago 实际上是 ActiveSupport 的一部分,而不是核心 ruby​​。在 4.1 中不推荐使用数字调用它,在 4.2 中不允许使用它。
  • @Kelvin 非常正确,感谢您的更正 - 不允许我编辑我的评论。
  • 这个答案会向下取整,而不是最接近的小时。 @andorov 的答案是正确的。
【解决方案2】:

在 Rails 中将日期时间四舍五入到最近的小时

(DateTime.now + 30.minutes).beginning_of_hour

不是实际问题的答案,但它确实回答了问题的标题(这就是我到达这里的方式)。

【讨论】:

  • 等于30.minutes.from_now.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 并不重要。 :)

【讨论】:

  • 检查我找到的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多