diff --git a/lib/chronic/parser.rb b/lib/chronic/parser.rb index f0887245..edcb0e50 100644 --- a/lib/chronic/parser.rb +++ b/lib/chronic/parser.rb @@ -185,7 +185,19 @@ def tokenize(text, options) tokens.select { |token| token.tagged? } end - def tokens_to_span(tokens, options) + def cleanup_double_day(tokens) + day_name_index = tokens.index { |o| o.get_tag(RepeaterDayName) } + day_index = tokens.index { |o| o.get_tag(RepeaterDay) || o.get_tag(ScalarDay) || o.get_tag(OrdinalDay) } + year_index = tokens.index { |o| o.get_tag(ScalarYear) || o.get_tag(OrdinalYear) } + + if year_index && day_name_index && day_index && day_name_index < day_index + tokens.delete_at(day_name_index) + end + + tokens + end + + def tokens_to_span(tokens, options, cleaned = false) definitions = definitions(options) (definitions[:endian] + definitions[:date]).each do |handler| @@ -216,6 +228,8 @@ def tokens_to_span(tokens, options) end puts '-none' if Chronic.debug + + return tokens_to_span(cleanup_double_day(tokens), options, true) unless cleaned return nil end end diff --git a/test/helper.rb b/test/helper.rb index cb961435..dd79fc92 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -5,7 +5,7 @@ require 'minitest/autorun' -class TestCase < MiniTest::Test +class TestCase < Minitest::Test def self.test(name, &block) define_method("test_#{name.gsub(/\W/, '_')}", &block) if block end diff --git a/test/test_parsing.rb b/test/test_parsing.rb index 932b4d23..f65c514a 100644 --- a/test/test_parsing.rb +++ b/test/test_parsing.rb @@ -12,6 +12,9 @@ def test_handle_generic time = Chronic.parse("2012-08-02T13:00:00") assert_equal Time.local(2012, 8, 2, 13), time + time = Chronic.parse("Sunday 2025-01-19 at 5pm") + assert_equal Time.local(2025, 1, 19, 17), time + time = Chronic.parse("2012-08-02T13:00:00+01:00") assert_equal Time.utc(2012, 8, 2, 12), time