Временная манипуляция в рубине
Я хочу создать экземпляр DateTime, который будет 20 минут и 10 секунд в будущем.
Я пробовал с Time и DateTime в irb, но, похоже, не мог понять способ, который действительно имеет смысл. Я могу добавлять только дни к объектам DateTime и добавлять только секунды к объектам Time.
Нет ли лучшего способа, чем всегда конвертировать время, которое я хочу добавить за считанные секунды?
Ответы
Ответ 1
A Time
- это количество секунд с эпохи, тогда как a DateTime
- это число дней с эпохи, поэтому добавление 1
в DateTime
добавляет целый день. Однако вы можете добавить доли дня, например
d = DateTime.now
d + Rational(10, 86400)
Будет добавлено 10 секунд до d
(так как есть 86400 секунд в день).
Если вы используете Rails, ActiveSupport добавляет некоторые вспомогательные методы, и вы можете сделать
d + 20.minutes + 10.seconds
Что будет делать правильно, d
- это DateTime
или Time
. Вы можете использовать ActiveSupport самостоятельно, и в эти дни вы можете использовать только нужные вам биты. Кажется, я помню, что этот материал находится в activesupport/duration
. Я считаю, что есть еще несколько драгоценных камней, которые также помогают справиться со временем.
Ответ 2
Ну, интерфейс прост и прост:
t = Time.now
t + (20 * 60 + 10)
Если вы хотите иметь что-то удобное, вы можете добавить методы в класс Time
:
class Time
def add_minutes(m)
self + (60 * m)
end
end
Но я не думаю, что это проще:
t = Time.now
t.add_minutes(20) + 10
Ответ 3
Предполагая, что вам требуется ActiveSupport или вы работаете в проекте Rails. Очень простой и понятный способ сделать это в рубине:
DateTime + 5.minutes
Time + 5.minutes
Также работает с .seconds, .hours, .days, .weeks, .month, .years
Ответ 4
Просто используйте активные расширения времени поддержки. Они очень удобны и менее подвержены ошибкам, чем попытка сделать это вручную. Вы можете импортировать только необходимый модуль:
# gem 'activesupport'
require 'active_support/core_ext/numeric/time.rb'
DateTime.now + 20.minutes
NB: Да, это противоречит тому, что сторона StackOverflow не находится в стороне от сторонних библиотек, но вы не должны избегать использования библиотек, когда они практически стандартизированы, значительно уменьшают ваш риск и обеспечивают лучшую четкость кода.