【问题标题】:How can I create a new Date instance in Ruby如何在 Ruby 中创建一个新的 Date 实例
【发布时间】:2012-09-14 16:53:43
【问题描述】:

如何在 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)

【问题讨论】:

  • 你看文档了吗?
  • 是的,我做到了。谢谢。仍在寻找答案。
  • 这个ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/Date.html 说我应该能够按照我尝试的方式使用这些方法。
  • 你需要require 'date' 来获得标准库的实现——核心类是一个精简的版本。是的,这很令人困惑。

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


【解决方案1】:

根据Date documentation

require 'date'

Date.new(2001,2,25)           #=> #<Date: 2001-02-25 
Date.jd(2451966)             #=> #<Date: 2001-02-25 
Date.ordinal(2001,56)        #=> #<Date: 2001-02-25 
Date.commercial(2001,8,7)    #=> #<Date: 2001-02-25 
Date.parse('2001-02-25')     #=> #<Date: 2001-02-25 
Date.strptime('25-02-2001', '%d-%m-%Y') #=> #<Date: 2001-02-25 
Time.new(2001,2,25).to_date   #=> #<Date: 2001-02-25 

【讨论】:

  • 对于那些想知道参数的隐含顺序是否受到美国或世界其他地区日期排序的启发的人,参数的排序是合乎逻辑且中性的Date.new(year, month, day)
  • 如果简单地写成Date.new(2001, 2, 25)会更容易猜到
  • 根据建议从“02-03”更新为“02-25”:)
【解决方案2】:
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 > 

【讨论】:

    【解决方案3】:

    我发现以下内容比 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】:

      如果您想在 Rails 之外获得对 Date 的 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

      【讨论】:

      • 标准库 Date 类也支持parse,所以不需要 ActiveSupport。
      【解决方案5】:
      Date.strptime("2012-09-21 19:45:48","%Y-%m-%d %H:%M:%S")
      

      【讨论】:

        【解决方案6】:

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

        require 'date'
        

        正是您所需要的。它不是一组内置的类或模块。

        你会得到两个类,

        Date
        DateTime
        

        您现在可以使用docs中的信息

        【讨论】:

          【解决方案7】:
          require 'date'
          Date::strptime("29-05-2017", "%d-%m-%Y")
          

          因此,您需要在代码中包含此 date 模块,然后使用方法 strptime 在其中您可能会注意到一年,我使用了大写 Y 因为全年作为 strptime 方法的第一个参数输入。如果日期类似于“29-05-17”,您可以使用小的 y

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-24
            • 2013-12-26
            • 1970-01-01
            • 2023-02-11
            • 2013-10-20
            • 1970-01-01
            • 2019-10-14
            • 2011-05-20
            相关资源
            最近更新 更多