Skip to main content

Python datetime guide

· 3 min read
zaxro

常見 datetime 應用

日期介於幾天之間

範例一.日期介於昨日到七天前

資料ticket_detail['result']['close_time']他的字串值是2023-04-17 02:36:55這類,是否屆於昨日到七天前,是就 print yes

format=datetime.now() #<class 'datetime.datetime'>

today = datetime.now().date() #<class 'datetime.date'>

yesterday = today - timedelta(days=1) #<class 'datetime.date'>

seven_days_ago = today - timedelta(days=7) #<class 'datetime.date'>

date_format = "%Y-%m-%d %H:%M:%S" #把字串為2023-04-17 02:36:55依據格式換成datetime.datetime物件

# 使用datetime.strptime方法把字串依據格式換成 datetime.datetime物件,使用date方法變成datetime.date物件進行比較
if seven_days_ago<= datetime.strptime("2023-04-17 02:36:55",date_format).date() <= yesterday:
print("yes")
info

範例二:timedelta 物件運用,憑證是否在今天到 30 天之間到期

# 將到期日期字串轉換為 datetime 格式
vaild_date = datetime.strptime("2023-04-17 02:36:55", date_format)

# 取得當前時間
now_time = datetime.now() #2023-04-17 20:33:01.577635

# 計算到期日期與當前時間的時間差,注意這邊是timedelta物件囉!
vaild_days = vaild_date - now_time

# 印出時間差和時間差的資料型態
print(vaild_days) #-1 day, 6:11:15.206948
print(type(vaild_days)) #<class 'datetime.timedelta'>

# 判斷時間差是否在 當下到 30 天之間到期
if vaild_days > timedelta(days=0) and vaild_days < timedelta(days=30):
print(vaild_days)
print("ok")

tip

注意~

以上面為例,到期時間為"2023-04-17 02:36:55",當下時間為 2023-04-17 20:25:39.793060,這種情況下很明顯到期時間是小於當下時間的,相減結果會是-1 day, 6:03:53.422373.

由此可知,只要前時間小於後時間,剪出來的 day 都會是負數,也就是你的憑證到期了!

另外,如果是 datetime.date 之類物件減去 timedelta 物件,是不會變成 timedelta 物件!

vaild_date=datetime.strptime("2023-04-17 02:36:55",date_format).date()
print(type(vaild_date-timedelta(days=1))) # <class 'datetime.date'>

如果是 datetime.date 之類物件減去 datetime.date 物件,是會變成 timedelta 物件的!

vaild_date=datetime.strptime("2023-04-17 02:36:55",date_format).date()
print(type(datetime.now().date()-vaild_date)) #<class 'datetime.timedelta'>

但如果是 datetime.datetime 之類物件減去 datetime.date 物件會報錯 TypeError: unsupported operand type(s) for -: 'datetime.date' and 'datetime.datetime'

tip

datetime.datetime 同類別可以相減

datetime.date 同類別可以相減

datetime.datetime 之類減去 datetime.date 會報錯

datetime.datetime 跟 datetime.date 都可以減去 timedelta