我目前有这个if语句:
if Time.now.day == 1 and Time.now.hour == 0 and Time.now.minute == 0 and Time.now.second == 0
有更简洁的方法吗?
答案 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}" }