ruby中的时间操纵

我想创建一个将来20分10秒的DateTime实例。 我在irb中尝试使用Time和DateTime,但似乎无法找到一种真正有意义的方法。 我只能向DateTime对象添加天数,只向Time对象添加秒数。

是不是有一个更好的方法,而不是总是将我想要添加的时间转换为秒?

Time是自纪元以来的秒数,而DateTime是自纪元以来的天数,这就是为什么在DateTime添加1会增加一整天的原因。 但是,您可以添加一天中的一小部分

 d = DateTime.now d + Rational(10, 86400) 

将添加10秒到d (因为一天有86400秒)。

如果您使用的是Rails,ActiveSupport会添加一些辅助方法,您可以这样做

 d + 20.minutes + 10.seconds 

哪个会做正确的事情是dDateTimeTime 。 您可以单独使用ActiveSupport,现在您可以只提供所需的位数。 我似乎记得这个东西是activesupport/duration 。 我相信还有一些其他gem也提供时间处理方面的帮助。

只需使用有效的支持时间扩展。 与手动尝试相比,它们非常方便且不易出错。 您只需导入所需的模块:

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

注意:是的,这违反了StackOverflow方面的第三方库,但你不应该避免使用库,因为它们实际上是标准的,可以显着降低风险,并提供更好的代码清晰度。

假设您需要ActiveSupport或者您正在使用Rails项目。 在ruby中执行此操作的一种非常简单的可读方式是:

 DateTime + 5.minutes Time + 5.minutes 

也适用于.seconds, .hours, .days, .weeks, .month, .years

那么,界面简单明了:

 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