如何在Ruby中创建新的Date实例

时间:2012-09-22 14:21:06

标签: ruby-on-rails ruby date datetime activesupport

如何在给定日期的IRB中创建新的Date对象。 以下不起作用。

1.9.3p194 :053 > require 'active_support'
 => true 
1.9.3p194 :054 > Date.new
 => #<Date:0x9d80730> 
1.9.3p194 :055 > Date.parse('12/01/2012')
NoMethodError: undefined method `parse' for Date:Class
        from (irb):55

1.9.3p194 :055 > Date.new('12/01/2012')
ArgumentError: wrong number of arguments(1 for 0)

7 个答案:

答案 0 :(得分:34)

根据Date documentation

require 'date'

Date.new(2001,2,3)           #=> #<Date: 2001-02-03 ...>
Date.jd(2451944)             #=> #<Date: 2001-02-03 ...>
Date.ordinal(2001,34)        #=> #<Date: 2001-02-03 ...>
Date.commercial(2001,5,6)    #=> #<Date: 2001-02-03 ...>
Date.parse('2001-02-03')     #=> #<Date: 2001-02-03 ...>
Date.strptime('03-02-2001', '%d-%m-%Y')
                             #=> #<Date: 2001-02-03 ...>
Time.new(2001,2,3).to_date   #=> #<Date: 2001-02-03 ...>

答案 1 :(得分:5)

1.9.3-p125 :012 > require 'date'
 => true 
1.9.3-p125 :013 > Date::new(2012,02,03)
 => #<Date: 2012-02-03 ((2455961j,0s,0n),+0s,2299161j)> 
1.9.3-p125 :014 > 

答案 2 :(得分:1)

如果您尝试在Rails之外的日期获得active_support扩展,则必须使用core_ext模块:

require 'active_support/core_ext/date/calculations'
Date.parse('12/01/2012')
=> #<Date: 2012-01-12 ((2455939j,0s,0n),+0s,2299161j)>

此Rails指南中的更多信息:http://edgeguides.rubyonrails.org/active_support_core_extensions.html

答案 3 :(得分:1)

我没有足够的声誉来评论塞巴斯蒂安·勒·卡洛内克(SébastienLe Callonnec)的答案,但我发现以下内容比Date.new更容易记住:

require 'active_support/core_ext/string'
'2019-03-31'.to_date
=> #<Date: 2019-03-21 ((2458564j,0s,0n),+0s,2299161j)>

请参见https://apidock.com/rails/String/to_date

答案 4 :(得分:0)

Date.strptime("2012-09-21 19:45:48","%Y-%m-%d %H:%M:%S")

答案 5 :(得分:0)

您需要使用Ruby标准库中的日期扩展名。 文档中的大多数示例并不总是向您显示要求它。

require 'date'

是你需要的。它不是一组内置的类或模块。

你得到两个带有这个添加的类,

Date
DateTime

然后您可以使用docs

中的信息

答案 6 :(得分:0)

require 'date'
Date::strptime("29-05-2017", "%d-%m-%Y")

因此,您需要在代码中包含此 date 模块,然后使用 strptime 方法,您可能会注意到这一年,我使用过资本 Y 因为输入全年作为strptime方法的第一个参数。如果日期类似于&lt; 29-05-17&#39;则可以使用小 y