web-dev-qa-db-ja.com

Python夏時間

夏時間が有効かどうかを確認するにはどうすればよいですか?

40
Pawel Furmaniak

_time.localtime_ を使用して、戻り値の_tm_isdst_フラグを確認できます。

_>>> import time
>>> time.localtime()
(2010, 5, 21, 21, 48, 51, 4, 141, 0)
>>> _.tm_isdst
0
_

time.localtime()を使用すると、任意の時間に同じ質問をして、DSTが現在のタイムゾーンで有効であるかどうかを確認できます。

63
Greg Hewgill

ラップトップでコードを実行している場合、受け入れられた回答は問題ありませんが、ほとんどの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=Nonetimezone.localizeのパラメーターとして指定しました。これにより、意味のない時間でエラーがスローされます。 is_dst=Falseを使用してこれらのエラーを無視し、その間はFalseを返すことができます。

12
mehtunguh

これを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
0
otocan

上記の@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())
0
Jose Alban