Ruby-在下一分钟开始时获取时间

时间:2018-12-31 00:25:18

标签: ruby datetime

我正在寻找一种简洁的方法来获取一个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解决方案。是否存在?

4 个答案:

答案 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)