簡體   English   中英

Pytz將時間轉換為UTC而沒有DST

[英]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.

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