From a778719a55da82f5a3d1ca5cecd9041530d4d6e9 Mon Sep 17 00:00:00 2001 From: Scott Gasch Date: Thu, 12 May 2022 19:14:34 -0700 Subject: [PATCH] Fix an edge condition around the Nth weekday of the month when the first day of the month is that target weekday. --- dateparse/dateparse_utils.py | 21 ++++++++++----------- tests/dateparse_utils_test.py | 1 + 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/dateparse/dateparse_utils.py b/dateparse/dateparse_utils.py index bd0d491..ee2bbd9 100755 --- a/dateparse/dateparse_utils.py +++ b/dateparse/dateparse_utils.py @@ -672,10 +672,10 @@ class DateParser(dateparse_utilsListener): del self.context['dow'] self.context['delta_unit'] = dow - # For the nth Fooday in Month, start at the 1st of the - # month and count ahead N Foodays. For the last Fooday in - # Month, start at the last of the month and count back one - # Fooday. + # For the nth Fooday in Month, start at the last day of + # the previous month count ahead N Foodays. For the last + # Fooday in Month, start at the last of the month and + # count back one Fooday. if n == -1: month += 1 if month == 13: @@ -684,17 +684,16 @@ class DateParser(dateparse_utilsListener): tmp_date = datetime.date(year=year, month=month, day=1) tmp_date = tmp_date - datetime.timedelta(days=1) - self.context['year'] = tmp_date.year - self.context['month'] = tmp_date.month - self.context['day'] = tmp_date.day - # The delta adjustment code can handle the case where # the last day of the month is the day we're looking # for already. else: - self.context['year'] = year - self.context['month'] = month - self.context['day'] = 1 + tmp_date = datetime.date(year=year, month=month, day=1) + tmp_date = tmp_date - datetime.timedelta(days=1) + + self.context['year'] = tmp_date.year + self.context['month'] = tmp_date.month + self.context['day'] = tmp_date.day self.main_type = DateParser.PARSE_TYPE_BASE_AND_OFFSET_EXPR except Exception as e: raise ParseException(f'Invalid nthWeekday expression: {ctx.getText()}') from e diff --git a/tests/dateparse_utils_test.py b/tests/dateparse_utils_test.py index 6e539ff..8dd8131 100755 --- a/tests/dateparse_utils_test.py +++ b/tests/dateparse_utils_test.py @@ -73,6 +73,7 @@ parsable_expressions = [ ('2 sun in jun', datetime.datetime(2021, 6, 13)), ('easter -40 days', datetime.datetime(2021, 2, 23)), ('easter +39 days', datetime.datetime(2021, 5, 13)), + ('2nd Sunday in May, 2022', datetime.datetime(2022, 5, 8)), ('1st tuesday in nov, 2024', datetime.datetime(2024, 11, 5)), ( '2 days before last xmas at 3:14:15.92a', -- 2.46.0