夏時間が有効かどうかを確認するにはどうすればよいですか?
_time.localtime
_ を使用して、戻り値の_tm_isdst
_フラグを確認できます。
_>>> import time
>>> time.localtime()
(2010, 5, 21, 21, 48, 51, 4, 141, 0)
>>> _.tm_isdst
0
_
time.localtime()
を使用すると、任意の時間に同じ質問をして、DSTが現在のタイムゾーンで有効であるかどうかを確認できます。
ラップトップでコードを実行している場合、受け入れられた回答は問題ありませんが、ほとんどのpythonアプリケーションは、UTCをローカル時間として使用するサーバーで実行されているため、次のように夏時間になることはありません。受け入れられた答え。
2番目の問題は、地域によって夏時間を実装する日時が異なることです。したがって、たとえdatetime.utcnow()
のように明確な時刻があるとしても、あるタイムゾーンでは夏時間であり、別のタイムゾーンではない可能性があります。
私たちができる最善のことは、特定のタイムゾーンのDST中に特定の時間が発生するかどうかを知ることです。それを行うために見つけることができる最善の方法は、すでに pytzlocalize
によって実装されています。関数を使用して、ラップトップとサーバーの両方で機能するかなり良い答えを得ることができます。
import pytz
from datetime import datetime
def is_dst(dt=None, timezone="UTC"):
if dt is None:
dt = datetime.utcnow()
timezone = pytz.timezone(timezone)
timezone_aware_date = timezone.localize(dt, is_dst=None)
return timezone_aware_date.tzinfo._dst.seconds != 0
いくつかの例
>>> is_dst() # it is never DST in UTC
False
>>> is_dst(datetime(2019, 1, 1), timezone="US/Pacific")
False
>>> is_dst(datetime(2019, 4, 1), timezone="US/Pacific")
True
>>> is_dst(datetime(2019, 3, 10, 2), timezone="US/Pacific")
NonExistentTimeError
>>> is_dst(datetime(2019, 11, 3, 1), timezone="US/Pacific")
AmbiguousTimeError
is_dst
関数では、is_dst=None
をtimezone.localize
のパラメーターとして指定しました。これにより、意味のない時間でエラーがスローされます。 is_dst=False
を使用してこれらのエラーを無視し、その間はFalse
を返すことができます。
これをdatetime
で実行したい場合
pytz
を使用してタイムゾーンを認識させ、そのdst
プロパティを確認します。
import datetime
import pytz
def is_dst(dt,timeZone):
aware_dt = timeZone.localize(dt)
return aware_dt.dst() != datetime.timedelta(0,0)
timeZone = pytz.timezone("Europe/London")
dt = datetime.datetime(2019,8,2)
is_dst(dt,timeZone)
True
dt = datetime.datetime(2019,2,2)
is_dst(dt,timeZone)
False
上記の@Greg Hewgillの回答を拡張し、ローカルタイムゾーンに対処すると(pip install tzlocal
の助けを借りて)、次のようになります。
import time
from datetime import datetime, timedelta
from tzlocal import get_localzone
def to_local(dt):
"""From any timezone to local datetime - also cope with DST"""
localtime = time.localtime()
if localtime.tm_isdst:
utctime = time.gmtime()
hours_delta = timedelta(hours=(localtime.tm_hour - utctime.tm_hour))
dt = dt - hours_delta
return dt.replace(tzinfo=get_localzone())