如何将两周时间添加到 Time.now?

Posted

技术标签:

【中文标题】如何将两周时间添加到 Time.now?【英文标题】:How do I add two weeks to Time.now? 【发布时间】:2011-08-19 20:04:59 【问题描述】:

如何在 Ruby 中为当前 Time.now 添加两周?我有一个使用 DataMapper 的小型 Sinatra 项目,在保存之前,我有一个填充了当前时间加上两周的字段,但没有按需要工作。任何帮助是极大的赞赏!我收到以下错误:

NoMethodError at /
undefined method `weeks' for 2:Fixnum

这是模型的代码:

class Job
  include DataMapper::Resource

  property :id,           Serial
  property :position,     String
  property :location,     String
  property :email,        String
  property :phone,        String
  property :description,  Text
  property :expires_on,   Date
  property :status,       Boolean
  property :created_on,   DateTime
  property :updated_at,   DateTime

  before :save do
    t = Time.now
    self.expires_on = t + 2.week
    self.status = '0'
  end
end

【问题讨论】:

【参考方案1】:

在纯 Ruby 中没有这么好的助手。您可以添加秒数:

Time.now + (2*7*24*60*60)

但是,幸运的是,那里有许多日期助手库(或构建您自己的;))

【讨论】:

如果 ActiveSupport 中您唯一需要的就是这段代码,我认为这是最好的解决方案(您可以将其包装在您自己的自定义方法中)。只为这一计算加载整个 ActiveSupport 代码似乎很愚蠢...... 将数字相乘以添加日期通常是个坏主意。原始乘法没有考虑闰年以及不同月份有不同天数等因素。任何语言都有日期/时间类的原因是为了封装正确的日期数学,这样你就不用像这样手动数学了。 @SamuelGoodwin 我不相信你。你能举一个它不起作用的例子吗? @J-_-L 在夏令时更改的前一天中午,距第二天中午还有 25 小时。春季夏令时的前一天中午,距离第二天中午还有 23 小时。 您可以require 'active_support/core_ext' 并获得星期/星期/星期和其他日期,而无需加载所有的主动支持。【参考方案2】:

Ruby Date 类有 methods 可以在时间中添加除秒之外的日期和月份。 一个例子:

require 'date'
t = DateTime.now
puts t      # => 2011-05-06T11:42:26+03:00

# Add 14 days
puts t + 14 # => 2011-05-20T11:42:26+03:00

# Add 2 months
puts t >> 2 # => 2011-07-06T11:42:26+03:00

# And if needed, make Time object out of it
(t + 14).to_time   # => 2011-05-20 11:42:26 +0300

【讨论】:

我有 Ruby 1.8.7,我有 Ruby 2.0! +1 用于使用标准库而不是使用 Active Support。还值得注意的是,操纵时间的方法在Date class【参考方案3】:
require 'rubygems'
require 'active_support/core_ext/numeric/time'
self.expires = 2.weeks.from_now

【讨论】:

这对我不起作用。我仍然遇到同样的错误。还有其他建议吗? 是否安装了 active_support gem?做一个gem install rails 并给自己一个漂亮的新副本。它在 Rails 之外非常方便。 阅读 guides.rubyonrails.org/active_support_core_extensions.html 的第 1.1 节可能会有所帮助。 Active_Support 不再使用require 'active_support' 加载任何内容。 铁皮人是正确的。你需要require 'active_support/core_ext/numeric/time' 在版本 4.1.6 的 gem activesupport require 'active_support/core_ext/numeric/time' 中不包括 Date 所需的 2.weeks.from_now 函数 advance。我用require 'active_support/all' 解决了它,它有效。当您可以一次添加所有 gem 函数时,何必费心呢?【参考方案4】:

您必须使用秒来计算日期之间的时间,但您可以使用 Time 类作为助手从日期部分元素中获取秒数。

Time.now + 2.week.to_i

编辑:正如@iain 所提到的,您将需要主动支持来完成使用2.week.to_i,如果您不能(或不想)拥有这种依赖关系,您可以随时使用+ 运算符来添加秒数到 Time 实例 (time + numeric → time docs here)

Time.now + (60 * 60 * 24 * 7 * 2)

【讨论】:

这需要加载一个额外的库,我猜是 Active Support。 -1 来自我。 @iain 好点!刚刚添加了一些文档参考和非活动支持后备答案 a -1 现在变成了 +1! :) 感谢您更新答案。 Time.now + 2.week 在没有 .to_i 的情况下工作得很好(至少在 Rails 中) @aaron-coding 我明白了......好吧,我想这取决于 ruby​​/ActiveSupport 版本【参考方案5】:

我认为week/weeks 是在active support numeric 扩展中定义的

$ ruby -e 'p Time.now'
2011-05-05 22:27:04 -0400
$ ruby -r active_support/core_ext/numeric -e 'p Time.now + 2.weeks'
2011-05-19 22:27:07 -0400

【讨论】:

【参考方案6】:

你可以使用这3种模式

# you have NoMethod Error undefined method 
require 'active_support/all'

# Tue, 28 Nov 2017 11:46:37 +0900
Time.now + 2.weeks

# Tue, 28 Nov 2017 11:46:37 +0900
Time.now + 2.week

# Tue Nov 28 11:48:24 +0900 2017
2.weeks.from_now

【讨论】:

【参考方案7】:
<%current_time=Time.now
  current_time_s=current_time.strftime('%Y-%m-%d %H:%M:%S').to_s #show currrent date time
 current_time= Time.now + (60 * 60 * 24 * 7 * 250)
 current_time_e=current_time.strftime('%Y-%m-%d %H:%M:%S').to_s #show datetime after week
%>

【讨论】:

【参考方案8】:

我也喜欢我的:)

def minor?(dob)
  n = DateTime.now
  a = DateTime.parse(dob)
  a >> 12*18 > n
end

省去考虑闰年和秒的麻烦。开箱即用。

【讨论】:

以上是关于如何将两周时间添加到 Time.now?的主要内容,如果未能解决你的问题,请参考以下文章

如何伪造 Time.now?

如何在 Rails 中将当前时间添加 10 天

如何将两种类型的值添加到JTable行?

如何在日期范围内获取数据?

时间和日期相关函数

[Go关于时间] time库/扩展now库