如何将两周时间添加到 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?的主要内容,如果未能解决你的问题,请参考以下文章