我想创建一个位于未来 20 分 10 秒的 DateTime 实例。我在 irb 中尝试了 Time 和 DateTime ,但似乎找不到真正有意义的方法。我只能向 DateTime 对象添加天数,并且只能向 Time 对象添加秒数。
没有比总是将我想添加的时间转换为秒更好的方法吗?
ATime
是一个纪元以来的秒数,而 aDateTime
是一个纪元以来的天数,这就是为什么添加1
到 aDateTime
会增加一整天。但是,您可以添加一天中的部分时间,例如
d = DateTime.now
d + Rational(10, 86400)
将增加 10 秒d
(因为一天有 86400 秒)。
如果您使用的是 Rails,Active Support 会添加一些辅助方法,您可以这样做
d + 20.minutes + 10.seconds
哪个会做正确的事情d
是 aDateTime
或 a Time
。您可以单独使用 Active Support,而现在您可以只获取您需要的部分。我似乎记得这东西在activesupport/duration
. 我相信还有一些其他的宝石也可以在时间处理方面提供帮助。
假设您需要 Active Support 或者您正在从事 Rails 项目。在 Ruby 中执行此操作的一种非常简单且易读的方法是:
DateTime + 5.minutes
Time + 5.minutes
也适用于seconds
, hours
, days
, weeks
, months
, years
.
只需使用 Active Support Time 扩展。与尝试手动执行此操作相比,它们非常方便且不易出错。您可以只导入您需要的模块:
# gem 'activesupport'
require 'active_support/core_ext/numeric/time.rb'
DateTime.now + 20.minutes
注意:是的,这违背了 StackOverflow 方远离 3rd 方库的路线,但是当它们实际上是标准库时,你不应该避免使用它们,显着降低风险,并提供更好的代码清晰度。
如上所述,您可以添加seconds
到 Time 对象,因此如果您调用to_time
DateTime 对象,则可以向其添加秒数:
DateTime.strptime("11/19/2019 18:50","%m/%d/%Y %H:%M") + 1 => adds a day
(DateTime.strptime("11/19/2019 18:50","%m/%d/%Y %H:%M").to_time) +1 => adds a second
这不需要添加宝石。
class Numeric
def minutes; self/1440.0 end
alias :minute :minutes
def seconds; self/86400.0 end
alias :second :seconds
end
其中 1440 是分钟数,86400 是一天中的秒数。基于 Rails 的做法。
然后你可以让魔法发生:
d + 20.minutes + 10.seconds