当前位置:  开发笔记 > 后端 > 正文

如何在Ruby中将时间缩短到最近的15分钟?

如何解决《如何在Ruby中将时间缩短到最近的15分钟?》经验,为你挑选了7个好方法。

有一种简单的方法可以将时间缩短到最近的15分钟吗?

这就是我目前正在做的事情.有更简单的方法吗?

t = Time.new
rounded_t = Time.local(t.year, t.month, t.day, t.hour, t.min/15*15)

Ryan McGeary.. 127

你说"向下",所以我不确定你是否真的在寻找圆形或地板,但这里是两个代码.如果你向Time类添加round_offfloor方法,我认为这样的东西读得很好.额外的好处是您可以更容易地随时分区.

require 'active_support/core_ext/numeric' # from gem 'activesupport'

class Time
  # Time#round already exists with different meaning in Ruby 1.9
  def round_off(seconds = 60)
    Time.at((self.to_f / seconds).round * seconds).utc
  end

  def floor(seconds = 60)
    Time.at((self.to_f / seconds).floor * seconds).utc
  end
end

t = Time.now                    # => Thu Jan 15 21:26:36 -0500 2009
t.round_off(15.minutes)         # => Thu Jan 15 21:30:00 -0500 2009
t.floor(15.minutes)             # => Thu Jan 15 21:15:00 -0500 2009

注意: ActiveSupport仅用于pretty 15.minutes参数.如果您不想要该依赖项,请15 * 60改用.



1> Ryan McGeary..:

你说"向下",所以我不确定你是否真的在寻找圆形或地板,但这里是两个代码.如果你向Time类添加round_offfloor方法,我认为这样的东西读得很好.额外的好处是您可以更容易地随时分区.

require 'active_support/core_ext/numeric' # from gem 'activesupport'

class Time
  # Time#round already exists with different meaning in Ruby 1.9
  def round_off(seconds = 60)
    Time.at((self.to_f / seconds).round * seconds).utc
  end

  def floor(seconds = 60)
    Time.at((self.to_f / seconds).floor * seconds).utc
  end
end

t = Time.now                    # => Thu Jan 15 21:26:36 -0500 2009
t.round_off(15.minutes)         # => Thu Jan 15 21:30:00 -0500 2009
t.floor(15.minutes)             # => Thu Jan 15 21:15:00 -0500 2009

注意: ActiveSupport仅用于pretty 15.minutes参数.如果您不想要该依赖项,请15 * 60改用.


并不是说Time对象已经具有[round](http://www.ruby-doc.org/core-2.0/Time.html#method-i-round)方法,所以这可能会破坏一些现有代码。(`p t.round(5).iso8601(10)#=>“ 2010-03-30T05:43:25.1234600000Z”`)
如果需要*下一次* 15分钟间隔,请尝试使用`ceil` def round_up(seconds = 60)Time.at((self.to_f / seconds).ceil * seconds)end的版本

2> cmsjr..:

我不太熟悉ruby的语法,但你可以使用modulo 向下舍入到最接近的15分钟.(即x - (x modulo 15)).我猜想语法会是这样的

t.min - ( t.min % 15)

这将使您的可能值集合为0,15,30和45.假设0 <= t.min <= 59.



3> Jarno Lamber..:

我想我会发布另一个解决方案,提供向上和向下舍入到最接近的秒数.哦,这并没有像其他一些解决方案那样改变时区.

class Time
  def round(sec=1)
    down = self - (self.to_i % sec)
    up = down + sec

    difference_down = self - down
    difference_up = up - self

    if (difference_down < difference_up)
      return down
    else
      return up
    end
  end
end

t = Time.now                             # => Mon Nov 15 10:18:29 +0200 2010
t.round(15.minutes)                      # => Mon Nov 15 10:15:00 +0200 2010
t.round(20.minutes)                      # => Mon Nov 15 10:20:00 +0200 2010
t.round(60.minutes)                      # => Mon Nov 15 10:00:00 +0200 2010

在x.minutes功能的示例中使用了ActiveSupport.您可以使用15*60代替.

基于该解决方案,可以容易地实现地板和天花板.


这是这里唯一合乎逻辑的"舍入"示例.谢谢亚诺

4> Chuck..:

由于Ruby允许Times上的算术(以秒为单位),你可以这样做:

t = Time.new
rounded_t = t-t.sec-t.min%15*60



5> Brian Hempel..:

我写了Rounding gem来处理这些案例.

四舍五入的时间就像召唤时间一样简单floor_to.也支持(ceil_toround_to)舍入和舍入到最近.

require "rounding"

Time.current.floor_to(15.minutes) # => Thu, 07 May 2015 16:45:00 UTC +00:00
Time.current.ceil_to(15.minutes)  # => Thu, 07 May 2015 17:00:00 UTC +00:00
Time.current.round_to(15.minutes) # => Thu, 07 May 2015 16:45:00 UTC +00:00

保留原始时间的时区(在这种情况下为UTC).您不需要加载ActiveSupport - 您可以编写floor_to(15*60)它,它将正常工作.gem使用Rational数字来避免舍入错误.您可以通过提供抵消来舍入到最近的星期一round_to(1.week, Time.parse("2015-5-4 00:00:00 UTC")).我们在生产中使用它.

我写了一篇博文,解释了更多内容.希望你觉得它有用.



6> jewilmeer..:

我找到了一个非常易读的解决方

这会将你的时间缩短到最后的15分钟.您可以更改15.minutes为每个时间刻度.

Time.at(Time.now.to_i - (Time.now.to_i % 15.minutes))



7> Shalmanese..:

你可以这样做:

Time.at(t.to_i/(15*60)*(15*60))

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有