Вопрос по ruby – Время манипуляции в рубине

22

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

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

Ваш Ответ

3   ответа
3

Просто используйте активные расширения времени поддержки. Они очень удобны и менее подвержены ошибкам, чем попытки сделать это вручную. Вы можете импортировать только тот модуль, который вам нужен:

# gem 'activesupport'
require 'active_support/core_ext/numeric/time.rb'
DateTime.now + 20.minutes

N.B: Yes, this goes against the StackOverflow party line of staying away from 3rd party libraries, but you shouldn't avoid using libraries when they are practically standard, reduce your risk significantly, and provide better code clarity.

3

Предполагая, что вам требуется ActiveSupport или вы работаете в проекте Rails. Очень простой читаемый способ сделать это в ruby:

DateTime + 5.minutes
Time + 5.minutes

Также работает с.seconds, .hours, .days, .weeks, .month, .years

спасибо за информацию - я думал, что это стандартное поведение ruby
Обратите внимание, что это предполагает, что у вас есть ActiveSupport или Rails.
51

Time количество секунд, начиная с эпохи, тогда как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, Я считаю, что есть несколько других драгоценных камней, которые также помогают справиться со временем.

@AndrewMarshall Согласен, и если кто-то не выполняет этоDateTime манипуляции миллионы на миллионы раз, еще две операции умножения не стоятmicro-optimizing, Даже не думайте об этом, пока не столкнетесь с проблемой производительности. Еще лучше, как насчет простого объявления константы в начале кода?SECONDS_PER_DAY = 60 * 60 * 24и использовать это. То же самое можно сделать дляMINUTERS_PER_DAY = 60 * 24 а такжеHOURS_PER_DAY = 24хотя, может быть, последний и не нужен, но хорошо быть последовательным и просто перечислить их все.
Лично я предпочитаю писать60 * 60 * 24 чтобы было немного более очевидно, откуда взялась магическая цифра, хотя она, очевидно, будет немного медленнее во время выполнения

Похожие вопросы