Ruby: конвертировать время в секунды? - PullRequest
17 голосов
/ 29 сентября 2010

Как я могу преобразовать время как 10:30 в секунды? Есть ли какая-то встроенная функция Ruby для этого?

Обычно пытается определить количество секунд от полуночи (00:00) до определенного времени дня (например, 10:30 или 18:45).

Ответы [ 8 ]

30 голосов
/ 29 сентября 2010

Вы можете использовать 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
9 голосов
/ 24 мая 2013

Еще одна реализация:

Time.now.to_i - Date.today.to_time.to_i # seconds since midnight
9 голосов
/ 29 сентября 2010

Встроенная библиотека time расширяет класс Time для анализа строк, так что вы можете использовать это.В конечном счете, они представлены в секундах с эпохи UNIX, поэтому преобразование в целые числа и вычитание должно дать вам то, что вы хотите.

require 'time'
m = Time.parse('00:00')
t = Time.parse('10:30')

(t.to_i - m.to_i)
=> 37800

В ActiveSupport также есть некоторый сахар для обработки этих типов вещей.

3 голосов
/ 29 сентября 2010

Возможно, есть более лаконичный способ, но:

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

сработает.

2 голосов
/ 28 февраля 2017

Вы можете просто использовать

Time.parse("10:30").seconds_since_midnight
1 голос
/ 13 мая 2018

Мне очень нравятся эти ответы, особенно Teddy's за аккуратность.

Есть одна вещь, на которую стоит обратить внимание. Ответ Тедди дает секунду дня в текущем регионе , и я не смог преобразовать Date.today.to_time в UTC. Я закончил с этим обходным путем:

Time.now.to_i % 86400

Он основан на том факте, что Time.now.to_i дает секунд с начала эпохи Unix , что всегда равно 1970-01-01T00:00:00Z, независимо от вашего текущего часового пояса. И тот факт, что в день также есть 86400 секунд. Так что это решение всегда будет давать вам секунды с последней UTC полуночи.

1 голос
/ 24 мая 2013
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")

Все отличные ответы, это то, что я в конечном итоге использовал.

0 голосов
/ 30 сентября 2017

В обычном рубине самым быстрым является сумма временных частей:

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)

Итак, вот метод, который учитывает часовой пояс, если необходимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...