我正在寻找一种简洁的方法来获得表示下一分钟(如果可能的话,还有小时/日/月/年)的Ruby Time
对象。我希望它能在纯Ruby环境中工作,因此Rails函数Time.change
或类似函数不符合要求。
一开始这看起来很简单--只要给Time.now
加1就行了,但是也有一些极端的情况,例如,当当前分钟是59时,你试图用Time.now.min + 1
示例化一个Time
对象,你会得到一个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解决方案。
5条答案
按热度按时间yvt65v4c1#
如果没有ActiveSupport,就不会那么干净:
4dbbbstv2#
我们可以通过获取一天中的当前秒数来使此计算更容易理解。(可选)
DateTime.current.to_i
给出了自1970年以来的秒数,DateTime.current.to_i - DateTime.current.beginning_of_day.to_i
给出了自一天开始以来的秒数。(((number_of_seconds_through_the_day + 60)/60) * 60)
提供下一分钟开始时的秒数然后我们减去这两个数字,得到下一分钟之前的秒数。
如果我们想知道下一分钟开始时的确切时间,那么我们可以:
DateTime.current + seconds_until_start_of_the_next_minute.seconds
ttvkxqim3#
您可以使用
#to_i
将Time
对象转换为UNIX纪元时间(自1970年以来的秒数),添加60秒,然后转换回Time
对象。编辑:甚至更短-您可以直接将整数秒添加到
Time.now
:编辑2:一行程序-只需减去
Time.now.sec
:uxhixvfz4#
其他选项,在距离午夜还有一秒时:
一分钟内:
您将获得:
# HAPPY NEW YEAR!
mmvthczy5#
Ruby内置了添加月(
>>
)和日(+
)的方法。一年是12个月,一小时是一天的1/24。