如何在Time.now中添加两周?

Jos*_*own 38 ruby time

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

NoMethodError at /
undefined method `weeks' for 2:Fixnum
Run Code Online (Sandbox Code Playgroud)

以下是模型的代码:

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
Run Code Online (Sandbox Code Playgroud)

J-_*_*_-L 65

你没有普通Ruby中那么好的帮手.你可以添加秒:

Time.now + (2*7*24*60*60)
Run Code Online (Sandbox Code Playgroud)

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

  • @J -_- L在夏令时下降时间前一天中午,第二天中午是25小时.在夏令时春天变化的前一天中午,第二天中午是23小时. (8认同)
  • 如果您需要ActiveSupport中唯一需要的是此代码,我认为这是最佳解决方案(您可以将其包装在您自己的自定义方法中).看起来愚蠢地加载整个ActiveSupport代码只是为了这个计算...... (3认同)

Laa*_*aas 53

除了Time中的秒数之外,Ruby Date类还有添加日期和月份的方法.一个例子:

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
Run Code Online (Sandbox Code Playgroud)

  • +1使用标准库而不使用Active Support.值得注意的是,操作时间的方法可以在[Date class]中找到(http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/Date.html) (3认同)

Ale*_*yne 21

require 'rubygems'
require 'active_support/core_ext/numeric/time'
self.expires = 2.weeks.from_now
Run Code Online (Sandbox Code Playgroud)


Fel*_*ino 20

您必须使用秒来在日期之间进行计算,但您可以使用Time类作为帮助来获取日期部分元素的秒数.

Time.now + 2.week.to_i
Run Code Online (Sandbox Code Playgroud)

编辑:正如@iain所提到的,你需要Active Support来完成usign 2.week.to_i,如果你不能(或者不想)拥有这种依赖关系,你总是可以使用+运算符来为Time实例添加秒数(时间+数字→时间)这里的文档)

Time.now + (60 * 60 * 24 * 7 * 2)
Run Code Online (Sandbox Code Playgroud)


oyl*_*gul 19

我认为week/weeks是在活动支持数字扩展中定义的

$ 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
Run Code Online (Sandbox Code Playgroud)


jam*_*amy 5

你可以使用这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
Run Code Online (Sandbox Code Playgroud)