Ruby: Convert time to seconds?

后端 未结 8 658
甜味超标
甜味超标 2020-12-28 08:16

How can I convert a time like 10:30 to seconds? Is there some sort of built in Ruby function to handle that?

Basically trying to figure out the number of seconds fro

相关标签:
8条回答
  • 2020-12-28 08:30

    Yet another implementation:

    Time.now.to_i - Date.today.to_time.to_i # seconds since midnight
    
    0 讨论(0)
  • 2020-12-28 08:32

    I like these answers very much, especially Teddy's for its tidyness.

    There's one thing to note. Teddy's answer gives second of day in current region and I haven't been able to convert Date.today.to_time to UTC. I ended up with this workaround:

    Time.now.to_i % 86400
    

    It's based on the fact that Time.now.to_i gives seconds since Unix Epoch which is always 1970-01-01T00:00:00Z, regardless of your current time zone. And the fact that there's 86400 seconds in a day as well. So this solution will always give you seconds since last UTC midnight.

    0 讨论(0)
  • 2020-12-28 08:39

    You can simply use

    Time.parse("10:30").seconds_since_midnight
    
    0 讨论(0)
  • 2020-12-28 08:39

    In plain ruby the fastest is the sum of time parts:

    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)
    

    So, here is a method that takes timezone into account, if needed

    def seconds_since_midnight(time: Time.now, utc: true)
      time = time.utc if utc
      time.hour * 3600 + time.min * 60 + time.sec
    end
    
    0 讨论(0)
  • 2020-12-28 08:41

    The built in time library extends the Time class to parse strings, so you could use that. They're ultimately represented as seconds since the UNIX epoch, so converting to integers and subtracting should get you what you want.

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

    There's also some sugar in ActiveSupport to handle these types of things.

    0 讨论(0)
  • 2020-12-28 08:46

    Perhaps there is a more succinct way, but:

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

    would do the trick.

    0 讨论(0)
提交回复
热议问题