有没有更简洁的方法来结合Ruby中的许多比较?

时间:2010-11-30 04:55:26

标签: ruby comparison if-statement

我目前有这个if语句:

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

有更简洁的方法吗?

7 个答案:

答案 0 :(得分:5)

您可以使用Time#to_a将时间转换为数组(秒,分钟,小时,日,月,年,日,星期日,星期日,区域):

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]

答案 1 :(得分:4)

[:day,:hour,:minute,:second].map{|s|Time.now.send s}==[1,0,0,0]

答案 2 :(得分:3)

标准的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?

答案 3 :(得分:2)

怎么样?

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

我喜欢这个,因为它非常自我记录;很明显,你比较午夜的某一天。

说明:strftime()方法可以轻松输出自定义日期和/或时间字符串。此格式输出月,日,分和秒的日期。

Time.now.strftime('%d %H:%M:%S') #=> "01 16:54:24"

答案 4 :(得分:1)

您可以将其与您创建的时间进行比较:

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

if Time.now == Time.utc(2000,"jan",1,20,15,1)

答案 5 :(得分:1)

我想你正在尝试制作类似于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

答案 6 :(得分:0)

 %w(day==1 hour==0 minute==0 second==0).all? { |e| eval "Time.now.#{e}" }