Ruby: математические функции для значений времени

Как мне добавить / вычесть / и т. д. значения времени в Ruby? Например, как мне добавить следующие времена?

00:00:59 + 00:01:43 + 00:20:15 =?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
4 030
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это некрасиво, но вы можете использовать DateTime.parse (each_interval) и вычислить количество секунд в каждом. Как это:

require 'date'

def calc_seconds(time_string)
  date_time = DateTime.parse(time_string)
  hour_part = date_time.hour * 60 * 60
  minute_part = date_time.minute * 60
  second_part = date_time.second
  hour_part + minute_part + second_part
end

... который дает вам результат за секунды, при условии, что введены правильные данные. На этом этапе вы можете сложить их вместе.

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

Я действительно думаю, что должен быть более простой метод, но я не знаю ни одного.

Один из способов - преобразовать все в секунды, а затем выполнить операции ... Затем вам нужно будет снова преобразовать его в объект времени с

Time.at(seconds_result).strftime('%H:%M:%S')

И вы получите время, красиво отформатированное (в виде строки).

Я пытаюсь найти драгоценный камень, который выполняет эту и другие операции.

Вероятно, вы захотите использовать драгоценный камень, который не имеет отношения к текущему дню. Вы можете выполнять акробатические трюки, используя DateTime и / или Time, но вы постоянно будете бороться за то, как управлять днями.

Один драгоценный камень, который может быть полезен, - это tod (TimeOfDay), https://github.com/JackC/tod.

При этом вы можете напрямую выполнить TimeOfDay.parse «00:01:43», добавить значения и распечатать результат с помощью strftime («% H:% M:% S»).

Ответ принят как подходящий

Используйте ActiveSupport, в котором есть множество встроенных расширений дат.

require 'active_support/core_ext'
t1 = "#{Date.today} 00:00:59".to_time
t2 = "#{Date.today} 00:01:43".to_time
t3 = "#{Date.today} 00:20:15".to_time
t1.since(t2.seconds_since_midnight+t3.seconds_since_midnight)

или, если вас не интересует дата, только время:

t1.since(t2.seconds_since_midnight+t3.seconds_since_midnight).strftime("%H:%M:%S")

Чтобы увидеть полный список, посетите http://guides.rubyonrails.org/active_support_core_extensions.html#extensions-to-date.

Другие вопросы по теме