Как округлить время в меньшую сторону до ближайших 15 минут в Ruby?

Когда вы создаете xml, вы должны записать NavigationView после BaseLayout (FrameLayout, LinearLayout и т. д.)

<DrawerLayout>
    <FrameLayout />
    <NavigationView />
</DrawerLayout>
63
задан Readonly 16 January 2009 в 01:59
поделиться

6 ответов

Вы сказали, "округляют в меньшую сторону", таким образом, я не уверен, ищете ли Вы на самом деле раунд или пол, но вот код, чтобы сделать обоих. Я думаю, что что-то вроде этого читает действительно хорошо, если Вы добавляете round_off и floor методы к классу Времени. Дополнительное преимущество - то, что Вы можете более легко круглый любым разделом времени.

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 был только необходим для симпатичного 15.minutes аргумент. Если Вы не хотите той зависимости, используйте 15 * 60 вместо этого.

127
ответ дан Ian Vaughan 7 November 2019 в 12:23
поделиться

Я не очень знаком с синтаксисом рубина, но Вы можете раунд вниз к ближайшим 15 минутам с помощью по модулю. (т.е. x - (x по модулю 15)). Я предположил бы, что синтаксис будет чем-то как

t.min - ( t.min % 15)

, Это сделает Ваш набор возможных значений 0, 15, 30, и 45. Принятие 0 < = t.min < = 59.

22
ответ дан cmsjr 7 November 2019 в 12:23
поделиться

Вы могли сделать:

Time.at(t.to_i/(15*60)*(15*60))
5
ответ дан Shalmanese 7 November 2019 в 12:23
поделиться

Так как Ruby позволяет арифметику (в секундах) на Временах, можно просто сделать это:

t = Time.new
rounded_t = t-t.sec-t.min%15*60
11
ответ дан Chuck 7 November 2019 в 12:23
поделиться

Ваша текущая оценка с помощью

min / 15 * 15 

только усекает минуту, таким образом

15 => 15
16 => 15
..
29 => 15
30 => 30 

, Который не 'округляется'.

можно приблизить округление в плохом пути с

(( min + 7.5 ) / 15).to_i * 15 

Или, с помощью внутренностей:

( min.to_f / 15 ).round * 15
1
ответ дан Kent Fredric 7 November 2019 в 12:23
поделиться
# this is an extension of Ryan McGeary's solution, specifically for Rails.
# Note the use of utc, which is necessary to keep Rails time zone stuff happy.
# put this in config/initializers/time_extensions

require 'rubygems'
require 'active_support'

module TimeExtensions
  %w[ round floor ceil ].each do |_method|
    define_method _method do |*args|
      seconds = args.first || 60
      Time.at((self.to_f / seconds).send(_method) * seconds).utc
    end
  end
end

Time.send :include, TimeExtensions
4
ответ дан 24 November 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: