Module: DateParser

Defined in:
worklog/date_parser.rb

Class Method Summary collapse

Class Method Details

.parse_date_string(date_str, from_beginning = true) ⇒ Object

Best effort date parsing from multiple formats.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'worklog/date_parser.rb', line 7

def self.parse_date_string(date_str, from_beginning = true)
  return nil if date_str.nil?
  return nil if date_str.empty?
  return nil if date_str.length > 10

  # Try to parse basic format YYYY-MM-DD
  begin
    return Date.strptime(date_str, '%Y-%m-%d') if date_str.match(/^\d{4}-\d{1,2}-\d{1,2}$/)
  rescue Date::Error
    # puts "Date not in format YYYY-MM-DD."
  end

  # Try to parse format YYYY-MM
  begin
    if date_str.match(/^\d{4}-\d{1,2}$/)
      d = Date.strptime(date_str, '%Y-%m')
      return d if from_beginning

      return Date.new(d.year, d.month, -1)

    end
  rescue Date::Error
    # puts "Date not in format YYYY-MM."
  end

  # Try to parse format YYYY (without Q1234)
  if date_str.match(/^\d{4}$/)
    d = Date.strptime(date_str, '%Y')
    return d if from_beginning

    return Date.new(d.year, -1, -1)

  end

  # Long form quarter (2024-Q1, etc.)
  match = date_str.match(/(\d{4})-[qQ]([1234])/)
  if match
    year, quarter = match.captures.map(&:to_i)
    d = Date.new(year, ((quarter - 1) * 3) + 1, 1)
    return d if from_beginning

    return Date.new(d.year, d.month + 2, -1)

  end

  # Short form quarter
  match = date_str.match(/[qQ]([1234])/)
  return unless match

  quarter = match.captures.first.to_i
  d = Date.new(Date.today.year, ((quarter - 1) * 3) + 1, 1)
  return d if from_beginning

  Date.new(d.year, d.month + 2, -1)
end

.parse_date_string!(date_str, from_beginning = true) ⇒ Object

Raises:

  • (ArgumentError)


63
64
65
66
67
68
# File 'worklog/date_parser.rb', line 63

def self.parse_date_string!(date_str, from_beginning = true)
  date = parse_date_string(date_str, from_beginning)
  raise ArgumentError, "Could not parse date string: \"#{date_str}\"" if date.nil?

  date
end