From d5e2daf1e6025d921bcf15e434be34735e797dc5 Mon Sep 17 00:00:00 2001 From: itwrx Date: Sun, 18 May 2025 08:18:22 -0500 Subject: [PATCH] fix #10 and related unreported issues. --- helpers/datetime.nim | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/helpers/datetime.nim b/helpers/datetime.nim index 554016e..57af835 100644 --- a/helpers/datetime.nim +++ b/helpers/datetime.nim @@ -69,38 +69,30 @@ proc nextMonthlyOnWeekdayOfWeek*(weekdayString: string, ocurrence: string): Date let nextMonthsDate = now() + 1.months let weekNumStrings = @["1", "2", "3"] if ocurrence in weekNumStrings: - nextSendDate = nthWeekdayInMonth(year(nextMonthsDate), month(nextMonthsDate), weekdayString, parseInt(ocurrence)) - #when ocurrence == "last". + #nextSendDate = nthWeekdayInMonth(year(nextMonthsDate), month(now()), weekdayString, parseInt(ocurrence)) + nextSendDate = nthWeekdayInMonth(year(now()), month(now()), weekdayString, parseInt(ocurrence)) + if format(nextSendDate, "yyyy-MM-dd") <= format(now(), "yyyy-MM-dd"): + nextSendDate = nthWeekdayInMonth(year(nextMonthsDate), month(nextMonthsDate), weekdayString, parseInt(ocurrence)) else: - nextSendDate = lastWeekdayInMonth(year(nextMonthsDate), month(nextMonthsDate), weekdayString) - #only use next month if that day has already occured this month, otherwise adjust it for this month instead. - if monthDay(nextSendDate - 1.months) > monthDay(now()): - if ocurrence in weekNumStrings: - nextSendDate = nthWeekdayInMonth(year(nextMonthsDate), month(now()), weekdayString, parseInt(ocurrence)) - else: - nextSendDate = lastWeekdayInMonth(year(nextMonthsDate), month(now()), weekdayString) + #nextSendDate = lastWeekdayInMonth(year(nextMonthsDate), month(now()), weekdayString) + nextSendDate = lastWeekdayInMonth(year(now()), month(now()), weekdayString) + if format(nextSendDate, "yyyy-MM-dd") <= format(now(), "yyyy-MM-dd"): + nextSendDate = lastWeekdayInMonth(year(nextMonthsDate), month(nextMonthsDate), weekdayString) return nextSendDate proc nextYearlyOnWeekdayOfWeekOfMonth*(weekdayString, ocurrence, monthString: string): DateTime = - var nextSendDate, startingDate: DateTime - let nextYearsDate = now() + 1.years - #let startingDate = dateTime(year(nextYearsDate), monthFromString(monthString), 01, 0, 0, 0, 0) - startingDate = dateTime(year(nextYearsDate), monthFromString(monthString), 01) + var nextSendDate, startingDate, nextYearsDate: DateTime + nextYearsDate = now() + 1.years + nextYearsDate = dateTime(year(nextYearsDate), monthFromString(monthString), 01) let weekNumStrings = @["1", "2", "3"] if ocurrence in weekNumStrings: - nextSendDate = nthWeekdayInMonth(year(startingDate), month(startingDate), weekdayString, parseInt(ocurrence)) - #when ocurrence == "last". + nextSendDate = nthWeekdayInMonth(year(now()), month(now()), weekdayString, parseInt(ocurrence)) + if format(nextSendDate, "yyyy-MM-dd") <= format(now(), "yyyy-MM-dd"): + nextSendDate = nthWeekdayInMonth(year(nextYearsDate), month(nextYearsDate), weekdayString, parseInt(ocurrence)) else: - nextSendDate = lastWeekdayInMonth(year(startingDate), month(startingDate), weekdayString) - #only use next year if that month and day has already occured this year, otherwise adjust it for this year instead. - if nextSendDate - 1.years > now(): - startingDate = dateTime(year(now()), monthFromString(monthString), 01) - let weekNumStrings = @["1", "2", "3"] - if ocurrence in weekNumStrings: - nextSendDate = nthWeekdayInMonth(year(startingDate), month(startingDate), weekdayString, parseInt(ocurrence)) - #when ocurrence == "last". - else: - nextSendDate = lastWeekdayInMonth(year(startingDate), month(startingDate), weekdayString) + nextSendDate = lastWeekdayInMonth(year(now()), month(now()), weekdayString) + if format(nextSendDate, "yyyy-MM-dd") <= format(now(), "yyyy-MM-dd"): + nextSendDate = lastWeekdayInMonth(year(nextYearsDate), month(nextYearsDate), weekdayString) return nextSendDate #[ Returns the next occurrence of the specified month and day, which could be: