Подтвердить что ты не робот

Временная манипуляция в рубине

Я хочу создать экземпляр DateTime, который будет 20 минут и 10 секунд в будущем. Я пробовал с Time и DateTime в irb, но, похоже, не мог понять способ, который действительно имеет смысл. Я могу добавлять только дни к объектам DateTime и добавлять только секунды к объектам Time.

Нет ли лучшего способа, чем всегда конвертировать время, которое я хочу добавить за считанные секунды?

4b9b3361

Ответ 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 не находится в стороне от сторонних библиотек, но вы не должны избегать использования библиотек, когда они практически стандартизированы, значительно уменьшают ваш риск и обеспечивают лучшую четкость кода.