[英]Convert timezone naive datetime string to UTC datetime (but not using pytz)
[英]Pytz convert time to UTC without DST
在發布此內容之前,我已經做了很多研究,但似乎無法正確完成轉換。 我有一些帶有時間戳的數據,有些應用了DST,而另一些則沒有。 我認為指定不帶DST的正確方法是使用is_dst
參數。 所有3個選項的UTC偏移都相同,這是不正確的。 偏移量應為+1000。 進行此轉換的最佳方法是什么,為什么is_dst參數沒有任何區別?
pytz_eastern.localize(datetime(2018, 1, 18, 18, 50), is_dst=None).strftime('%Y-%m-%d %H:%M %z')
'2018-01-18 18:50 +1100'
pytz_eastern.localize(datetime(2018, 1, 18, 18, 50), is_dst=False).strftime('%Y-%m-%d %H:%M %z')
'2018-01-18 18:50 +1100'
pytz_eastern.localize(datetime(2018, 1, 18, 18, 50), is_dst=True).strftime('%Y-%m-%d %H:%M %z')
'2018-01-18 18:50 +1100'
大多數時間戳都將忽略
is_dst
參數。 它僅在DST過渡模糊期間使用,以解決該歧義。
您正在嘗試通過忽略過渡規則來轉換日期時間。 我認為pytz不會支持這一點。 取而代之的是,您可以選擇標准時間中的日期並要求其偏移量,然后使用它。
>>> from datetime import *
>>> import pytz
>>> pytz_eastern = pytz.timezone('Australia/Sydney')
utcoffset
方法提供特定日期時間的偏移量(而dst
方法也僅提供DST偏移量)。
>>> pytz_eastern.dst(datetime(2018, 6, 1))
datetime.timedelta(0)
>>> pytz_eastern.utcoffset(datetime(2018, 6, 1))
datetime.timedelta(0, 36000)
>>> pytz_eastern.dst(datetime(2018, 1, 1))
datetime.timedelta(0, 3600)
>>> pytz_eastern.utcoffset(datetime(2018, 1, 1))
datetime.timedelta(0, 39600)
從標准時間的日期中獲取utcoffset,然后直接將其與datetime的tzinfo
kwarg一起設置,然后將其提供給pytz進行轉換。
因此,這是一個未針對DST進行調整的日期時間,顯示在時鍾上:
>>> standard_offset = timezone(pytz_eastern.utcoffset(datetime(2018, 6, 1)))
>>> datetime(2018, 1, 18, 18, 50, tzinfo=standard_offset).strftime('%Y-%m-%d %H:%M %z')
'2018-01-18 18:50 +1000'
同樣的日期時間又回到了現實:
>>> datetime(2018, 1, 18, 18, 50, tzinfo=standard_offset).astimezone(pytz_eastern).strftime('%Y-%m-%d %H:%M %z')
'2018-01-18 19:50 +1100'
(標准偏移量似乎也可以通過._utcoffset
來獲取,但未記錄在案,因此這是要求特定日期使用utcoffset的原因,因為過去的偏移量更改的可能性較小。)
實際上,由於pytz為您提供了計算的偏移量和當前DST值,因此您可以將兩者相減以獲得忽略DST的標准偏移量。
def add_forgotten_dst(dt, zoneinfo):
'''Like pytz.localize, but ignores dst.'''
utcoffset = zoneinfo.utcoffset(dt)
dst = zoneinfo.dst(dt)
standard_offset = utcoffset - dst
dt = dt.replace(tzinfo=timezone(standard_offset))
return dt.astimezone(zoneinfo)
>>> naive_time = datetime(2018, 1, 18, 18, 50)
>>> print(pytz_eastern.localize(naive_time))
2018-01-18 18:50:00+11:00
>>> print(add_forgotten_dst(naive_time, pytz_eastern))
2018-01-18 19:50:00+11:00
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.