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

puruo6ea  于 2022-12-12  发布在  Ruby
关注(0)|答案(5)|浏览(134)

我正在寻找一种简洁的方法来获得表示下一分钟(如果可能的话,还有小时/日/月/年)的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解决方案。

yvt65v4c

yvt65v4c1#

如果没有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)
4dbbbstv

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

def seconds_until_start_of_the_next_minute
  number_of_seconds_through_the_day = DateTime.current.to_i - DateTime.current.beginning_of_day.to_i
  number_of_seconds_through_the_day_at_next_minute = (((number_of_seconds_through_the_day + 60)/60) * 60)
  seconds_until_next_minute_starts = number_of_seconds_through_the_day_at_next_minute - number_of_seconds_through_the_day
  return seconds_until_next_minute_starts
end
ttvkxqim

ttvkxqim3#

您可以使用#to_iTime对象转换为UNIX纪元时间(自1970年以来的秒数),添加60秒,然后转换回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
uxhixvfz

uxhixvfz4#

其他选项,在距离午夜还有一秒时:

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!

mmvthczy

mmvthczy5#

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)

相关问题