代码之家  ›  专栏  ›  技术社区  ›  Shpigford

鲁比:把时间转换成秒?

  •  17
  • Shpigford  · 技术社区  · 14 年前

    我怎样才能把10:30这样的时间转换成秒?是否有某种内置的Ruby函数来处理这个问题?

    8 回复  |  直到 14 年前
        1
  •  34
  •   Ramy    11 年前

    DateTime#parse 把一根绳子变成一根绳子 DateTime 对象,然后将小时乘以3600,分钟乘以60得到秒数:

    require 'date'
    
    # DateTime.parse throws ArgumentError if it can't parse the string
    if dt = DateTime.parse("10:30") rescue false 
      seconds = dt.hour * 3600 + dt.min * 60 #=> 37800
    end
    

    正如jleedev在评论中指出的,您还可以使用 Time#seconds_since_midnight 如果您有ActiveSupport:

    require 'active_support'
    Time.parse("10:30").seconds_since_midnight #=> 37800.0
    
        2
  •  11
  •   Teddy    11 年前

    Time.now.to_i - Date.today.to_time.to_i # seconds since midnight
    
        3
  •  9
  •   Derek    14 年前

    内置的 time

    require 'time'
    m = Time.parse('00:00')
    t = Time.parse('10:30')
    
    (t.to_i - m.to_i)
    => 37800
    

        4
  •  3
  •   bnaul    14 年前

    也许有更简洁的方法,但是:

    t = Time.parse("18:35")
    s = t.hour * 60 * 60 + t.min * 60 + t.sec
    

        5
  •  3
  •   Anoop    7 年前

    你可以简单地使用

    Time.parse("10:30").seconds_since_midnight
    
        6
  •  2
  •   iBug    6 年前

    我非常喜欢这些答案,尤其是 Teddy's 因为它的整洁。

    在当前区域 我还没能改变信仰 Date.today.to_time 到UTC。最后我找到了一个解决方法:

    Time.now.to_i % 86400
    

    Time.now.to_i 给予 自Unix时代以来的秒数 总是这样 1970-01-01T00:00:00Z UTC公司

        7
  •  1
  •   Gregology    11 年前
    require 'time'
    
    def seconds_since_midnight(time)
      Time.parse(time).hour * 3600 + Time.parse(time).min * 60 + Time.parse(time).sec
    end
    
    puts seconds_since_midnight("18:46")
    

    所有伟大的答案,这就是我最终使用的。

        8
  •  0
  •   Vadym Tyemirov    7 年前

    require 'benchmark'
    require 'time'
    
    Benchmark.bm do |x|
      x.report('date') { 100_000.times { Time.now.to_i - Date.today.to_time.to_i } }
      x.report('parse') { 100_000.times { Time.now.to_i - Time.parse('00:00').to_i } }
      x.report('sum') { 100_000.times { Time.now.hour * 3600 + Time.now.min * 60 + Time.now.sec } }
    end
    
           user     system      total        real
    date  0.820000   0.000000   0.820000 (  0.822578)
    parse  1.510000   0.000000   1.510000 (  1.516117)
    sum  0.270000   0.000000   0.270000 (  0.268540)
    

    所以,如果需要的话,这里有一个考虑时区的方法

    def seconds_since_midnight(time: Time.now, utc: true)
      time = time.utc if utc
      time.hour * 3600 + time.min * 60 + time.sec
    end