31

我想创建一个位于未来 20 分 10 秒的 DateTime 实例。我在 irb 中尝试了 Time 和 DateTime ,但似乎找不到真正有意义的方法。我只能向 DateTime 对象添加天数,并且只能向 Time 对象添加秒数。

没有比总是将我想添加的时间转换为秒更好的方法吗?

4

5 回答 5

64

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. 我相信还有一些其他的宝石也可以在时间处理方面提供帮助。

于 2012-04-07T16:27:22.217 回答
5

假设您需要 Active Support 或者您正在从事 Rails 项目。在 Ruby 中执行此操作的一种非常简单且易读的方法是:

DateTime + 5.minutes
Time + 5.minutes

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

于 2012-04-07T16:27:53.803 回答
4

只需使用 Active Support Time 扩展。与尝试手动执行此操作相比,它们非常方便且不易出错。您可以只导入您需要的模块:

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

注意:是的,这违背了 StackOverflow 方远离 3rd 方库的路线,但是当它们实际上是标准库时,你不应该避免使用它们,显着降低风险,并提供更好的代码清晰度。

于 2017-07-14T12:02:39.003 回答
1

如上所述,您可以添加seconds到 Time 对象,因此如果您调用to_timeDateTime 对象,则可以向其添加秒数:

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

这不需要添加宝石。

于 2019-11-22T12:09:29.180 回答
1

纯 Ruby(无 Rails)

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

来源:https ://github.com/rails/rails/blob/v6.0.3.1/activesupport/lib/active_support/core_ext/numeric/time.rb

于 2020-05-24T16:39:06.787 回答