Есть ли более краткий способ объединить множество сравнений в Ruby? - PullRequest
2 голосов
/ 30 ноября 2010

У меня сейчас есть выражение if:

if Time.now.day == 1 and Time.now.hour == 0 and Time.now.minute == 0 and Time.now.second == 0

Есть ли более лаконичный способ сделать это?

Ответы [ 7 ]

5 голосов
/ 30 ноября 2010

Вы можете использовать Время # to_a , чтобы преобразовать ваше время в массив (сек, мин, час, день, месяц, год, wday, yday, isdst, зона):

Time.now.to_a  # => [20, 57, 16, 30, 11, 2010, 2, 334, false, "CET"]

затем отрежьте только ту часть, с которой вы хотите сопоставить:

Time.now.to_a[0,4]  # => [20, 57, 16, 30]

Ваша конкретная проверка может быть сделана так кратко, как это:

if Time.now.to_a[0,4] == [0,0,0,1]
4 голосов
/ 30 ноября 2010
[:day,:hour,:minute,:second].map{|s|Time.now.send s}==[1,0,0,0]
3 голосов
/ 30 ноября 2010

Стандартная библиотека Ruby Time довольно проста, поэтому я бы просто добавил свой собственный метод, чтобы сделать это проще:

class Time
  def beginning_of_month
    Time.local(self.year, self.month, 1)
  end

  def beginning_of_month?
    self == beginning_of_month
  end
end

чтобы вы могли написать:

if Time.now.beginning_of_month?
2 голосов
/ 02 декабря 2010

Как насчет?

Time.now.strftime('%d %H:%M:%S') == '01 00:00:00'

Мне нравится это, потому что это очень самодокументировано; Очевидно, что вы сравниваете определенный день в полночь.

Объяснение: Метод strftime() упрощает вывод пользовательской строки даты и / или времени. Этот формат выводит день месяца, часа, минуты и секунды.

Time.now.strftime('%d %H:%M:%S') #=> "01 16:54:24"
1 голос
/ 30 ноября 2010

Полагаю, что вы пытаетесь создать нечто похожее на cron, т. Е. Вы находитесь в бесконечном цикле и проверяете, пришло ли время выполнить определенное действие.

Если это так, я не думаю, что вы должны полагаться на то, что ваша проверка метки времени будет приходиться именно на первую секунду дня. Что произойдет, если будет отложено (по какой-либо причине), и сначала он срабатывает на 23:59:59, а следующий цикл происходит на 00:00:01 вместо :00? Вы не сможете выполнить желаемое действие вообще.

Кроме того, вы хотели бы включить некоторые sleep, чтобы ваш пустой цикл не занимал все ваши ресурсы во время ожидания.

Вместо этого вы можете сохранить отметку времени последнего действия и сравнить now с отметкой времени следующего действия, выполнив действие, если now >= next_timestamp. Что-то вроде:

last_action_on = Time.at(0)
loop do
  now = Time.now
  next_action_on = Time.local(now.year, now.month, 1) # beginning of the current day
  if last_action_on < next_action_on && now >= next_action_on
    last_action_on = now
    do_action
  end
  sleep 1
end
1 голос
/ 30 ноября 2010

Вы можете сравнить его с временем, которое вы создали:

if Time.now == Time.at(0)

или

if Time.now == Time.utc(2000,"jan",1,20,15,1)
0 голосов
/ 02 декабря 2010
 %w(day==1 hour==0 minute==0 second==0).all? { |e| eval "Time.now.#{e}" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...