發現這個問題與時間戳轉換一起使用,.timestamp()
即使我使用utcnow()
方法創建了 datetime 物件,似乎也可以補償時間偏移。utcnow()
那么如果該方法在稍后轉換為時間戳時實際上失敗了,那么該方法的原因是什么?
def test_timestamp_issues():
now = datetime.now()
utc_now = datetime.utcnow()
utc_now_with_tz = datetime.now(timezone.utc)
print(f"Now: {now} -- As Timestamp: {now.timestamp()}")
print(f"Utc Now: {utc_now} -- As TimeStamp: {utc_now.timestamp()} "
f"with builtin: {datetime.timestamp(utc_now)}, with setting timezone hard: "
f"{utc_now.replace(tzinfo=timezone.utc).timestamp()}")
print(f"Utc Now: {utc_now_with_tz} -- As TimeStamp: {utc_now_with_tz.timestamp()} "
f"with builtin: {datetime.timestamp(utc_now_with_tz)}, with setting timezone hard: "
f"{utc_now_with_tz.replace(tzinfo=timezone.utc).timestamp()}")
輸出:
Now: 2022-04-25 09:12:16.881608 -- As Timestamp: 1650870736.881608
Utc Now: 2022-04-25 07:12:16.881613 -- As TimeStamp: 1650863536.881613 with builtin: 1650863536.881613, with setting timezone hard: 1650870736.881613
Utc Now: 2022-04-25 07:12:16.881753 00:00 -- As TimeStamp: 1650870736.881753 with builtin: 1650870736.881753, with setting timezone hard: 1650870736.881753
這里的預期時間戳應該是1650870736.881608但由于某種原因轉換 utcnow() 會再次向后退 2 小時。
utcnow()
因此,由于某種原因,在獲取創建的日期時間物件的時間戳時,我又獲得了 2 小時的退出時間。我目前正在運行帶有挪威時區( 1、 2 atm 日光)和 python 3.9.12 的 macbook m1 pro
那么這可能是手臂架構搞砸了事情,還是只是不建議使用utcnow()
然后轉換為時間戳?
uj5u.com熱心網友回復:
您的問題的答案是管理時區 (TZ)。當您使用或創建datetime
實體時,它不會存盤有關 TZ 的資訊。而且,根據 python檔案(作者加粗):now()
utcnow()
utcnow()
回傳當前的 UTC 日期和時間,使用
tzinfo
None。這類似于
now()
,但回傳當前的 UTC 日期和時間,作為一個天真的datetime
物件。可以通過呼叫來獲取當前的 UTC 日期時間datetime.now(timezone.utc)
。另請參閱now()
。警告:由于許多 datetime 方法將天真
datetime
的物件視為本地時間,因此最好使用感知日期時間來表示 UTC 時間。因此,創建表示當前 UTC 時間的物件的推薦方法是呼叫datetime.now(timezone.utc)
.
這意味著,盡管您收到了 UTC TZ 的時間,但utcnow()
由于沒有存盤 TZ 資訊(天真datetime
物件),python 將其視為本地時間。并且,在將其轉換為時間戳時,將再次添加/減去時間差。這種奇怪行為的證明可以在python docs for timestamp()
method中找到:
天真
datetime
的實體被假定為表示本地時間
原因實際上是你在問題標題中所說的那個,而不是ARM架構
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464336.html
上一篇:按用戶合并期間