Как я могу создать новый экземпляр Date в Ruby

Как я могу создать новый объект Date в IRB с заданной датой. Следующее не сработало.

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)

person Michael Durrant    schedule 22.09.2012    source источник
comment
Вы документацию смотрели?   -  person J. Holmes    schedule 22.09.2012
comment
да. Благодарю вас. Все еще ищу ответы.   -  person Michael Durrant    schedule 22.09.2012
comment
Этот ruby-doc.org/stdlib-1.9 .3/libdoc/date/rdoc/Date.html говорит, что я должен иметь возможность использовать методы так, как я пытался.   -  person Michael Durrant    schedule 22.09.2012
comment
Вам нужно require 'date' получить реализацию стандартной библиотеки - базовый класс представляет собой урезанную версию. Да, это довольно запутанно.   -  person Lars Haugseth    schedule 22.09.2012


Ответы (5)


Согласно документации даты:

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 
person Sébastien Le Callonnec    schedule 22.09.2012
comment
Для тех, кому интересно, вдохновлен ли неявный порядок параметров американским или остальным миром порядком дат, порядок параметров является логичным и нейтральным Date.new(year, month, day). - person Obromios; 02.06.2017
comment
было бы намного легче догадаться, если бы просто поставить как Date.new(2001, 2, 25) - person transGLUKator; 14.08.2017
comment
Обновлено с 03.02 по 25.02 по предложению :) - person Michael Durrant; 14.04.2020

Мне легче запомнить следующее, чем 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.

person jethro    schedule 06.03.2019

Если вы пытаетесь получить расширения active_support для Date вне Rails, вам придется использовать модуль 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

person rossta    schedule 22.09.2012
comment
Класс Date из стандартной библиотеки также поддерживает parse, поэтому для этого не требуется ActiveSupport. - person Lars Haugseth; 22.09.2012

Вам нужно использовать расширение даты из стандартной библиотеки Ruby. Большинство примеров в документах не всегда показывают, что вам это нужно.

require 'date'

было то, что вам нужно. Это не встроенный набор классов или модулей.

Вы получаете два класса с этим дополнением,

Date
DateTime

Теперь вы можете использовать информацию из документов.

person Douglas G. Allen    schedule 09.01.2017

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

Итак, вам нужно включить этот модуль date в свой код, а затем использовать метод strptime, внутри которого вы можете заметить, что для года я использовал заглавную Y, так как в качестве первого параметра метода strptime вводится полный год. Вы можете использовать маленькую y, если дата похожа на «29-05-17».

person coderGuy    schedule 29.05.2017