我需要檢查給定日期是否正好是從今天開始的一個月前,例如,如果今天是 2021 年 11 月 1 日,那么一個月前將是 2021 年 10 月 1 日(不完全是 30 天)。
我寫了一個代碼,它作業正常
today = fields.Date.from_string(fields.Date.today())
if today.month == 1:
one_month_ago = today.replace(year=today.year - 1, month=12)
else:
extra_days = 0
while True:
try:
one_month_ago = today.replace(month=today.month - 1, day=today.day -
extra_days)
break
except ValueError:
extra_days = 1
if one_month_ago == given_date:
# do something
else:
# do something
大多數情況下它都能很好地處理,但對某些情況處理不當。例如,給定日期是 31-March-2021,今天日期是 30-April-2021 和 31-April-2021 將無法比較。我需要我的代碼每天運行并檢查一些東西。它還對 1 月 29 日至 31 日的案件處理不當,因為 2 月 29 日至 31 日無法進行比較。
任何幫助都會很重要。謝謝。
uj5u.com熱心網友回復:
從給定的日期,您可以找到上個月和上一年,并使用這兩個獲得的值,找到上個月的長度。最后要做的是將給定日期的日期與上個月的長度進行比較,并相應地回傳所需的日期。
演示:
from datetime import date
from calendar import monthrange
def date_a_month_ago(today):
x = today.month - 1
previous_month = 12 if x == 0 else x
year = today.year - 1 if x == 0 else today.year
last_day_of_previous_month = monthrange(year, previous_month)[1]
day = last_day_of_previous_month if today.day > last_day_of_previous_month else today.day
return date(year, previous_month, day)
# Tests
print(date_a_month_ago(date(2021, 11, 1)))
print(date_a_month_ago(date(2021, 1, 31)))
print(date_a_month_ago(date(2021, 12, 31)))
print(date_a_month_ago(date(2021, 3, 29)))
print(date_a_month_ago(date(2020, 3, 29)))
print(date_a_month_ago(date(2021, 3, 30)))
print(date_a_month_ago(date(2020, 3, 30)))
輸出:
2021-10-01
2020-12-31
2021-11-30
2021-02-28
2020-02-29
2021-02-28
2020-02-29
ONLINE DEMO
uj5u.com熱心網友回復:
可能是這樣的:
from typing import Tuple
def last_month(year: int, month: int) -> Tuple[int, int]:
y, m = year, month - 1
if m == 0:
y, m = y - 1, 12
return y, m
def one_month_ago(today: datetime) -> datetime:
y, m = last_month(today.year, today.month)
dt = today.replace(year=y, month=m)
for day in range(today.day, 0, -1):
try:
return dt.replace(day=day)
except ValueError:
...
uj5u.com熱心網友回復:
我這樣做了,它給了我所需的輸出:
from datetime import date
from calendar import monthrange
def is_one_month(given_date, today):
x = today.month - 1
previous_month = 12 if x == 0 else x
year = today.year - 1 if x == 0 else today.year
last_day_of_previous_month = monthrange(year, previous_month)[1]
day = last_day_of_previous_month if today.day > last_day_of_previous_month else today.day
one_month_ago = date(year, previous_month, day)
if today.month == 2:
if given_date.month == today.month-1 and given_date.year == today.year and given_date.day >= 28:
return 'it is one month before'
if today.month == 4 or today.month == 6 or today.month == 9 or today.month == 11:
if given_date.month == today.month-1 and given_date.day == 31:
return 'it is one month before'
if one_month_ago == given_date:
return 'it is one month before'
else:
return 'it is NOT one month before'
print(is_one_month(date(2021, 1, 30), date(2021, 2, 28)))
輸出:
it is one month before
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/347852.html
上一篇:如何更改熊貓資料框中的時間格式
