問題陳述
似乎pythondatetime模塊中有一個錯誤,以下代碼片段應該是不言自明的:
import datetime
dep = datetime.datetime(2021, 9, 11, 7, 25)
arr = datetime.datetime(2021, 9, 11, 12, 35)
print(f"expected: -5h10m, real: {dep - arr}")
print(f"expected: 5h10m, real: {arr - dep}")
我用 python 3.10 得到了什么:
expected: -5h10m, real: -1 day, 18:50:00
expected: 5h10m, real: 5:10:00
題
這是一個錯誤還是一個功能?如果它是一個錯誤,我能做些什么來修復它?
uj5u.com熱心網友回復:
它是datetime從datetime結果中減去一個timedelta物件的特征,它被歸一化,因此只有負值可以是days。該行為被記錄在案,例如。這里:https : //pl.python.org/docs/lib/datetime-timedelta.html
uj5u.com熱心網友回復:
我會稱這種效果
expected: -5h10m, real: -1 day, 18:50:00
expected: 5h10m, real: 5:10:00
glitch,因為它僅限于查看,而兩個增量保持相同的秒數并且等于它們的相反數,可以如下檢查
import datetime
dep = datetime.datetime(2021, 9, 11, 7, 25)
arr = datetime.datetime(2021, 9, 11, 12, 35)
delta1 = dep - arr
delta2 = arr - dep
print(delta1.total_seconds()) # -18600.0
print(delta2.total_seconds()) # 18600.0
print(delta1 == -delta2) # True
print(delta2 == -delta1) # True
print(delta1 delta2) # 0:00:00
uj5u.com熱心網友回復:
您可以查看 datetime 物件中的減法實作,但它本質上與下面的代碼執行相同的操作。
import datetime
dep = datetime.datetime(2021, 9, 11, 7, 25)
arr = datetime.datetime(2021, 9, 11, 12, 35)
dep_days = dep.toordinal()
arr_days = dep.toordinal()
dep_secs = dep.second dep.minute * 60 dep.hour * 3600
arr_secs = arr.second arr.minute * 60 arr.hour * 3600
day_diff = dep_days - arr_days
sec_diff = dep_secs - arr_secs
micro_diff = dep.microsecond - arr.microsecond
base = datetime.timedelta(day_diff,sec_diff,micro_diff)
print(base)
timedelta 告訴您時間倒退一天,然后前進 18 小時 50 分鐘,這實際上只是意味著倒退 24 小時 18 小時 50 = 5 小時 10 分鐘
如果您只從字串表示的角度對此感興趣,您可以將其包裝在一個簡單的函式中,該函式將為您提供時間差的相對字串表示
import datetime
def relative_time_str(delta: datetime.timedelta):
neutral = datetime.timedelta()
if delta < neutral:
return f"-{neutral - delta}"
return f"{delta}"
dep = datetime.datetime(2021, 9, 11, 7, 25)
arr = datetime.datetime(2021, 9, 11, 12, 35)
print(f"expected: -5h10m, real: {relative_time_str(dep - arr)}")
print(f"expected: 5h10m, real: {relative_time_str(arr - dep)}")
輸出
expected: -5h10m, real: -5:10:00
expected: 5h10m, real: 5:10:00
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/370527.html
