fix month & year cycleEndDateTime calc error
This commit is contained in:
56
src/dt.py
56
src/dt.py
@@ -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:
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
Reference in New Issue
Block a user