2 回答

TA貢獻1801條經驗 獲得超8個贊
讓我們更清楚地說明這里的內容:
madrid = pytz.timezone('Europe/Madrid')
歐洲/馬德里時區,即 UTC+1/+2。
naive_ts = datetime.strptime('2019-03-01 14:45', '%Y-%m-%d %H:%M')
沒有任何特定時區的樸素時間戳。
madrid_ts = madrid.localize(naive_ts)
相同的時間戳,現在附加時區 Europe/Madrid,即馬德里的 14:45 (UTC+1)。
utc_ts = madrid_ts.astimezone(pytz.utc)
與UTC 中馬德里的 14:45 (UTC+1) 相同,因此,14:45 - 1 小時 → 13:45。一切都在預料之中。如果在馬德里是 14:45,那么在 UTC 是 13:45,因為馬德里比 UTC 早一小時。
datetime.now()
不管是什么……它與上述兩個時間戳中的任何一個都無關,并且取決于您機器的默認時區以及您執行此代碼時的當前時間。

TA貢獻1775條經驗 獲得超11個贊
我想你是誤會localize和astimezone,因為你是創建2019年3月1日14:45在與歐洲/馬德里時區的datetime對象localize,然后將其轉換為UTC與astimezone它給你意想不到的結果。
相反,您似乎打算為 2019-03-01 14:45 創建一個日期時間對象,然后您想以歐洲/馬德里時間和 UTC 時間顯示該日期時間。您可以使用astimezone或localize來獲得所需的結果。
astimezone 例子:
import datetime
import pytz
dt = datetime.datetime.strptime('2019-03-01 14:45','%Y-%m-%d %H:%M')
madrid_tz = pytz.timezone('Europe/Madrid')
madrid = dt.astimezone(madrid_tz)
print(madrid)
# 2019-03-01 15:45:00+01:00
utc = dt.astimezone(pytz.utc)
print(utc)
# 2019-03-01 14:45:00+00:00
localize 示例(請注意,日期時間對象是在對應于每個時區的時間創建的,因此兩者將代表相同的時間點):
import datetime
import pytz
madrid_tz = pytz.timezone('Europe/Madrid')
madrid = madrid_tz.localize(datetime.datetime(2019, 3, 1, 15, 45))
print(madrid)
# 2019-03-01 15:45:00+01:00
utc = pytz.utc.localize(datetime.datetime(2019, 3, 1, 14, 45))
print(utc)
# 2019-03-01 14:45:00+00:00
添加回答
舉報