1
0

fix month & year cycleEndDateTime calc error

This commit is contained in:
2021-03-06 13:36:16 +08:00
parent 7f107fc378
commit 4f8aa36518
2 changed files with 34 additions and 25 deletions

View File

@@ -45,27 +45,28 @@ def LoopHandle_Year(searchResult, starttime, times, tzoffset):
isStrict = searchResult.group(1) == 'S' isStrict = searchResult.group(1) == 'S'
yearSpan = int(searchResult.group(2)) yearSpan = int(searchResult.group(2))
times -= 1
newYear = clientYear = clientDate.year newYear = clientYear = clientDate.year
newMonth = clientMonth = clientDate.month newMonth = clientMonth = clientDate.month
newDay = clientDay = clientDate.day newDay = clientDay = clientDate.day
if clientMonth == 2 and clientDay == 29: if clientMonth == 2 and clientDay == 29:
if isStrict: if isStrict:
realSpan = utils.LCM(yearSpan, 4) realSpan = utils.LCM(yearSpan, 4)
print(realSpan)
valCache = starttime valCache = starttime
timesCache = times - 1 while valCache < MAX_TIMESTAMP and times > 0:
while valCache < MAX_TIMESTAMP and timesCache > 0:
newYear += realSpan newYear += realSpan
if not IsLeapYear(newYear): if not IsLeapYear(newYear):
continue continue
valCache = starttime + DAY1_SPAN * (DaysCount(newYear, newMonth, newDay) - DaysCount(clientYear, clientMonth, clientDay)) valCache = starttime + DAY1_SPAN * (DaysCount(newYear, newMonth, newDay) - DaysCount(clientYear, clientMonth, clientDay))
timesCache -= 1 times -= 1
else: else:
newYear = 0 if times == 1 else (times * yearSpan) newYear += times * yearSpan
if not IsLeapYear(newYear): if not IsLeapYear(newYear):
newDay = 28 # migrate to 28 newDay = 28 # migrate to 28
else: else:
# if times == 1, no extra datetime need to be added # if times == 1, no extra datetime need to be added
newYear += 0 if times == 1 else (times * yearSpan) newYear += times * yearSpan
val = starttime + DAY1_SPAN * (DaysCount(newYear, newMonth, newDay) - DaysCount(clientYear, clientMonth, clientDay)) val = starttime + DAY1_SPAN * (DaysCount(newYear, newMonth, newDay) - DaysCount(clientYear, clientMonth, clientDay))
return val if val < MAX_TIMESTAMP else MAX_TIMESTAMP return val if val < MAX_TIMESTAMP else MAX_TIMESTAMP
@@ -90,46 +91,56 @@ def LoopHandle_Month(searchResult, starttime, times, tzoffset):
if isStrict: if isStrict:
if loopType == 'A': if loopType == 'A':
while times > 0: while times > 0:
newMonth += 1 newMonth += monthSpan
if newMonth > 12: if newMonth > 12:
newMonth = 1 newYear += int((newMonth - 1) / 12)
newYear += 1 newMonth = ((newMonth - 1) % 12) + 1
if newYear > MAX_DATETIME.year:
break
maxDays = MonthDayCount[newMonth - 1] + (1 if newMonth == 2 and IsLeapYear(newYear) else 0) maxDays = MonthDayCount[newMonth - 1] + (1 if newMonth == 2 and IsLeapYear(newYear) else 0)
if dayStatistics[0] <= maxDays: if dayStatistics[0] <= maxDays:
times -= 1 times -= 1
elif loopType == 'B': elif loopType == 'B':
while times > 0: while times > 0:
newMonth += 1 newMonth += monthSpan
if newMonth > 12: if newMonth > 12:
newMonth = 1 newYear += int((newMonth - 1) / 12)
newYear += 1 newMonth = ((newMonth - 1) % 12) + 1
if newYear > MAX_DATETIME.year:
break
maxDays = MonthDayCount[newMonth - 1] + (1 if newMonth == 2 and IsLeapYear(newYear) else 0) maxDays = MonthDayCount[newMonth - 1] + (1 if newMonth == 2 and IsLeapYear(newYear) else 0)
if dayStatistics[1] <= maxDays: if dayStatistics[1] <= maxDays:
times -= 1 times -= 1
elif loopType == 'C': elif loopType == 'C':
while times > 0: while times > 0:
newMonth += 1 newMonth += monthSpan
if newMonth > 12: if newMonth > 12:
newMonth = 1 newYear += int((newMonth - 1) / 12)
newYear += 1 newMonth = ((newMonth - 1) % 12) + 1
if newYear > MAX_DATETIME.year:
break
monthStatistics = GetMonthWeekStatistics(newYear, newMonth) monthStatistics = GetMonthWeekStatistics(newYear, newMonth)
if dayStatistics[2] <= monthStatistics[dayStatistics[3]]: if dayStatistics[2] <= monthStatistics[dayStatistics[3]]:
times -= 1 times -= 1
elif loopType == 'D': elif loopType == 'D':
while times > 0: while times > 0:
newMonth += 1 newMonth += monthSpan
if newMonth > 12: if newMonth > 12:
newMonth = 1 newYear += int((newMonth - 1) / 12)
newYear += 1 newMonth = ((newMonth - 1) % 12) + 1
if newYear > MAX_DATETIME.year:
break
monthStatistics = GetMonthWeekStatistics(newYear, newMonth) monthStatistics = GetMonthWeekStatistics(newYear, newMonth)
if dayStatistics[4] <= monthStatistics[dayStatistics[5]]: if dayStatistics[4] <= monthStatistics[dayStatistics[5]]:
times -= 1 times -= 1
else: else:
newMonth += times * monthSpan newMonth += times * monthSpan
newYear += int(newMonth - 1 / 12) newYear += int((newMonth - 1) / 12)
newMonth = (newMonth % 12) + 1 newMonth = ((newMonth - 1) % 12) + 1
newDay = MonthDayCount[newMonth - 1] + (1 if newMonth == 2 and IsLeapYear(newYear) else 0)
# all method need calc newDay and it should be the last day of current selected month
# so calc it in there
newDay = MonthDayCount[newMonth - 1] + (1 if newMonth == 2 and IsLeapYear(newYear) else 0)
val = starttime + DAY1_SPAN * (DaysCount(newYear, newMonth, newDay) - DaysCount(clientYear, clientMonth, clientDay)) val = starttime + DAY1_SPAN * (DaysCount(newYear, newMonth, newDay) - DaysCount(clientYear, clientMonth, clientDay))
return val if val < MAX_TIMESTAMP else MAX_TIMESTAMP return val if val < MAX_TIMESTAMP else MAX_TIMESTAMP
@@ -145,9 +156,6 @@ def LoopHandle_Week(searchResult, starttime, times, tzoffset):
times-=1 # if first event is not suit for week loop rules, minus one more event to suit it. times-=1 # if first event is not suit for week loop rules, minus one more event to suit it.
fullWeek = int(times / weekEventCount) fullWeek = int(times / weekEventCount)
remainEvent = times % weekEventCount remainEvent = times % weekEventCount
print(fullWeek)
print(remainEvent)
print(nowDayOfWeek)
val = starttime + DAY7_SPAN * fullWeek * weekSpan val = starttime + DAY7_SPAN * fullWeek * weekSpan
if val > MAX_TIMESTAMP: if val > MAX_TIMESTAMP:

View File

@@ -2,6 +2,7 @@ import hashlib
import random import random
import uuid import uuid
import time import time
import math
ValidUsername = set(map(lambda x:chr(x), range(48, 58, 1))) | set(map(lambda x:chr(x), range(65, 91, 1))) | set(map(lambda x:chr(x), range(97, 123, 1))) ValidUsername = set(map(lambda x:chr(x), range(48, 58, 1))) | set(map(lambda x:chr(x), range(65, 91, 1))) | set(map(lambda x:chr(x), range(97, 123, 1)))
ValidPassword = set(map(lambda x:chr(x), range(33, 127, 1))) ValidPassword = set(map(lambda x:chr(x), range(33, 127, 1)))
@@ -47,5 +48,5 @@ def GCD(a, b):
return math.gcd(a, b) return math.gcd(a, b)
def LCM(a, b): def LCM(a, b):
return a * b / GCD(a, b) return int(a * b / GCD(a, b))