簡體   English   中英

如何將 dateutil.relativedelta 對象轉換為 datetime.timedelta 對象?

[英]How to convert dateutil.relativedelta object to datetime.timedelta object?

如何將 dateutil.relativedelta 對象轉換為 datetime.timedelta 對象?

例如,

# pip install python-dateutil

from dateutil.relativedelta import relativedelta
from datetime import timedelta

rel_delta = relativedelta(months=-2)
# How can I convert rel_delta to a timedelta object so that I can call total_seconds() ?
time_delta = ???(rel_delta)  
time_delta.total_seconds()  # call the timedelta.total_seconds() method

你不能,有一個很大的原因:它們不存儲相同的信息。 datetime.timedelta僅存儲天、秒和毫秒,而dateutil.relativedelta存儲饋送給它的每個時間組件

dateutil.relativedelta這樣做對於存儲諸如 1 個月的差異之類的內容很重要,但由於一個月的長度可能會有所不同,這意味着根本無法在datetime.timedelta表達相同的內容。

如果有人希望從特定日期relativedelta timedelta轉換為時間timedelta 只需添加和減去已知時間:

utcnow = datetime.utcnow()
rel_delta = relativedelta(months=-2)
time_delta = utcnow + rel_delta - utcnow  # e.g, datetime.timedelta(days=-62)

正如評論者指出的那樣,生成的timedelta值將因月份而異。

根據您想要調用total_seconds ,可以重構您的代碼以完全避免轉換。 例如,考慮檢查用戶是否超過 18 歲:

datetime.date.today() - user['dateOfBirth'] < datetime.timedelta(days=365*18)

這種檢查不是一個好主意,因為 timedelta 對象不考慮閏年之類的事情。 很容易重寫為:

datetime.date.today() - user['dateOfBirth'] < dateutil.relativedelta.relativedelta(years=18)

這需要將 timedelta (LHS) 與relativedelta (RHS) 進行比較,或者將一個轉換為另一個。 但是,您可以重構檢查以完全避免這種轉換:

user['dateOfBirth'] + dateutil.relativedelta.relativedelta(years=18) > datetime.date.today()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM