Module: SearchLingo::Parsers::MDY

Included in:
DateParser
Defined in:
lib/search_lingo/parsers/mdy.rb

Constant Summary collapse

US_DATE =

Pattern for matching US-formatted date strings.

The year may be two or four digits, or it may be omitted.

%r{(?<m>\d{1,2})/(?<d>\d{1,2})(?:/(?<y>\d{2}\d{2}?))?}

Class Method Summary collapse

Class Method Details

.parse(term, relative_to: Date.today) ⇒ Object

Returns a Date object for the date represented by term. Returns nil if term can not be parsed.

If the year has two digits, it will be implicitly expanded into a four-digit year by Date.parse. Otherwise it will be used as is.

If the year is omitted, it will be inferred using relative_to as a reference date. In this scenario, the resulting date will always be less than or equal to the reference date. If relative_to omitted, it defaults to today’s date.

Available as both a class method and an instance method.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/search_lingo/parsers/mdy.rb', line 25

def parse(term, relative_to: Date.today)
  term.match /\A#{US_DATE}\z/ do |m|
    return Date.parse "#{m[:y]}/#{m[:m]}/#{m[:d]}" if m[:y]

    ref   = relative_to
    day   = Integer(m[:d])
    month = Integer(m[:m])
    year  = if month < ref.month || month == ref.month && day <= ref.day
              ref.year
            else
              ref.year - 1
            end

    Date.new year, month, day
  end
rescue ArgumentError
end