我正在寻找一种简洁的方法来获取一个Ruby Time
对象,该对象表示下一分钟的顶部(以及小时/天/月/年,如果可能的话)。我希望它可以在纯Ruby环境中工作,所以Rails函数Time.change
或类似功能不适合您。
起初这似乎很简单-只需将1添加到Time.now
,但是在某些极端情况下,例如,当您尝试使用Time
实例化一个Time.now.min + 1
对象时,分钟是59,您将得到一个ArgumentError: min out of range
。同样适用于小时,日期和月份。
我有一些冗长的代码可以完成这项工作。这很丑,但我只是在尝试:
def add_minute
now = Time.local
year = now.year
month = now.month
day = now.day
hour = now.hour
min = now.min
if now.min == 59
if now.hour == 23
if now.day == Date.civil(now.year, now.month, -1).day
if month == 12
year = year + 1
month = 1
day = 1
hour = 0
min = 0
else
month = now.month + 1
day = 1
hour = 0
min = 0
end
else
day = now.day + 1
hour = 0
min = 0
end
else
hour = now.hour + 1
min = 0
end
else
min = now.min + 1
end
Time.local year, month, day, hour, min, 0
end
这似乎是一个简单的任务或内置任务,这显得荒唐冗长,但是我还没有找到一个本机的Ruby解决方案。是否存在?
答案 0 :(得分:2)
您可以使用Time
将#to_i
对象转换为UNIX纪元时间(自1970年以来的秒数),加上60 s,然后再转换回Time
对象。
time_unix = Time.now.to_i
time_unix_one_min_later = time_unix + 60
time_one_min_later = t = Time.at(time_unix_one_min_later)
time_one_min_later_rounded_down = Time.new(t.year, t.month, t.day, t.hour, t.min)
编辑:更短-您可以直接将整数秒添加到Time.now
:
time_one_min_later = t = Time.now + 60
time_one_min_later_rounded_down = Time.new(t.year, t.month, t.day, t.hour, t.min)
编辑2:单线-只需减去Time.now.sec
:
time_one_min_later_rounded_down = Time.now + 60 - Time.now.sec
答案 1 :(得分:2)
其他选择,从一秒钟到午夜十二点:
require 'time'
now = Time.strptime('2018-12-31 23:59:59', '%Y-%m-%d %H:%M:%S')
在一分钟之内:
Time.at(now + 60) #=> 2019-01-01 00:00:59 +0100
Time.at(now + 60 - now.sec) #=> 2019-01-01 00:00:00 +0100
您得到: # HAPPY NEW YEAR!
答案 2 :(得分:1)
Ruby内置了用于添加月份(>>
)和日期(+
)的方法。一年是12个月,一个小时是一天的1/24。
require 'date'
def add_time(time, year: 0 ,month: 0, day: 0, hour: 0, minute: 0)
time >>= 12*year
time >>= month
time += day
time += Rational(hour,24) # or (hour/24.0) if you dislike rationals
time += Rational(minute, 24*60) # (minute/24.0*60) if you dislike rationals
end
p t = DateTime.now
p add_time(t, year: 1, minute: 30)
答案 3 :(得分:0)
如果没有ActiveSupport,那不是很干净:
new_date = (DateTime.now + 1.to_f / (60*24))
DateTime.new(new_date.year, new_date.month, new_date.day, new_date.hour, new_date.minute)