web-dev-qa-db-ja.com

Python: "timezone aware"というdatetime.today()の値を取得するにはどうすればいいですか?

datetime.today()の値から1つ前の日付の値を引いて、どれくらい前に何かがあったことを計算しようとしています。しかしそれは文句を言う:

TypeError: can't subtract offset-naive and offset-aware datetimes

私の他の日付の値がそうである間、値datetime.today()は「時間帯を意識して」いるようには思われません。タイムゾーンに対応したdatetime.today()の値を取得する方法今は現地時間で時間を与えています、それはPST、つまりUTC-8時間です。最悪の場合、datetime.today()によって返されるdatetimeオブジェクトに手動でタイムゾーンの値を入力してUTC-8に設定する方法はありますか?もちろん、理想的な解決策は自動的にタイムゾーンを知ることです。

246
mindthief

標準ライブラリでは、独自のタイムゾーンクラスを作成せずに、意識したタイムゾーンを作成するためのクロスプラットフォームの方法はありません。

Windowsにはwin32timezone.utcnow()がありますが、それはpywin32の一部です。私はむしろ pytzライブラリ を使用することをお勧めします。これにはほとんどのタイムゾーンのデータベースが常に更新されています。

ローカルタイムゾーンの操作は非常に難しいことがあるため(特に「2つの時点の差を計算するなどの算術演算」の場合は)、アプリケーション全体でUTCを使用することをお勧めします。

あなたはそのように現在の日付/時刻を得ることができます:

import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)

datetime.today()datetime.now()はUTC時間ではなくローカル時間を返すので、それらに.replace(tzinfo=pytz.utc)を適用するのは正しくありません。

それをするもう一つの良い方法は:

datetime.now(pytz.utc)

これは少し短くて同じことをします。


多くの場合UTCを好む理由をさらに読んだり見たりすること:

306
AndiDog

特定のタイムゾーンで現在の時刻を取得します。

import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))
92
philfreo

Python 3では、標準ライブラリはタイムゾーンとしてUTCを指定することを非常に簡単にします。

>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2016, 8, 26, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)

標準ライブラリのみを使用し、Python 2とPython 3の両方で機能するソリューションが必要な場合は、 Jを参照してください。 F.セバスチャンの答え

42
Flimm

Python 2および3の両方で機能するstdlibソリューションを次に示します。

from datetime import datetime

now = datetime.now(utc) # timezone-aware datetime.utcnow()
today = datetime(now.year, now.month, now.day, tzinfo=utc) # midnight

ここで、todayはUTCの1日の始まり(真夜中)を表す認識日時インスタンスであり、utcはtzinfoオブジェクトです( ドキュメントの例 ):

from datetime import tzinfo, timedelta

ZERO = timedelta(0)

class UTC(tzinfo):
    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

utc = UTC()

関連:特定のUTC時間の午前0時(1日の始まり)を取得するいくつかの方法 のパフォーマンス比較
注:より複雑で、 固定されていないutcオフセットを持つタイムゾーンの深夜を取得する

18
jfs

現在の時刻を表すタイムゾーン対応のdatetimeオブジェクトを構築するためのもう1つの方法:

import datetime
import pytz

pytz.utc.localize( datetime.datetime.utcnow() )  
13
Dariusz Walczak

Djangoを使用している場合は、tzに対応していない日付を設定できます(utcのみ)。

settings.pyの以下の行にコメントを追加します。

USE_TZ = True
9
laffuste

これはstdlibでそれを生成する一つの方法です:

import time
from datetime import datetime

FORMAT='%Y-%m-%dT%H:%M:%S%z'
date=datetime.strptime(time.strftime(FORMAT, time.localtime()),FORMAT)

dateはUTCタイムゾーンでの日付ではなく、現地日付とUTCからのオフセットを格納するので、この解決法を使うことができます。のどのタイムゾーンの日付がに生成されているかを識別する必要があります。この例と私のローカルタイムゾーンでは:

date
datetime.datetime(2017, 8, 1, 12, 15, 44, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

date.tzname()
'UTC+02:00'

重要なのは、生成されたtime構造体のUTCオフセットを示すために、%zディレクティブを表現FORMATに追加することです。他の表現形式はdatetimeモジュール docs で調べることができます。

UTCタイムゾーンの日付が必要な場合は、time.localtime()time.gmtime()に置き換えることができます。

date=datetime.strptime(time.strftime(FORMAT, time.gmtime()),FORMAT)

date    
datetime.datetime(2017, 8, 1, 10, 23, 51, tzinfo=datetime.timezone.utc)

date.tzname()
'UTC'

編集

これはpython3でのみ動作します。 zディレクティブはpython 2 _ strptime.pyコードでは利用できません

6
jcazor

pytz は、Python 2.3以降を使用した正確でクロスプラットフォームのタイムゾーン計算を可能にするPythonライブラリです。

Stdlibでは、これは不可能です。

SO についても同様の質問を参照してください。

6
user225312

なぜここで説明されているようにdateutilを使用しないのでしょうか: http://joelinoff.com/blog/?p=802

from dateutil.tz import tzlocal
# Get the current date/time with the timezone.
now = datetime.datetime.now(tzlocal())
5
G. Führ

time.strftimeディレクティブ(Python 3.3で導入された)を使用する%z呼び出しの出力を jcazorで示される のように解析することで、timezoneを使用してローカルのdatetimeを作成できます。そのtimezoneを使用して、ワーカーライナーを使用して意識のあるdatetimeインスタンスを作成できます。

import time
from datetime import datetime

aware_local_now = datetime.now(
    tz=datetime.strptime(time.strftime("%z", time.localtime()), "%z").tzinfo)

print(aware_local_now)
2018-03-01 13:41:26.753644-08:00
2
Mihai Capotă

utc timezoneでタイムゾーンに対応した日付を取得することは、日付減算が機能するのに十分です。

しかし、現在のタイムゾーンにタイムゾーンに対応した日付が必要な場合は、tzlocalを使用します。

from tzlocal import get_localzone  # pip install tzlocal
from datetime import datetime
datetime.now(get_localzone())

PS dateutilも同様の機能を持っています(dateutil.tz.tzlocal)。しかし、名前を共有しているにもかかわらず、完全に異なるコードベースを持っています。 J.F. Sebastianによると は、間違った結果をもたらす可能性があります。

1

あなたが現在の日付と時刻をpythonで取得している場合、あなたは現在の日付と時刻を次のように取得するでしょう。

from datetime import datetime
import pytz
import time
str(datetime.strftime(datetime.now(pytz.utc),"%Y-%m-%d %H:%M:%S%t"))
0
jigar vagadiya

この回答を、UTC以外のタイムゾーンで頻繁に作業する人として追加しています。

独自のメソッドを持つ唯一のタイムゾーンはtimezone.utcですが、必要に応じてtimedeltatimezoneを使用して強制的に.replaceを使用して、タイムゾーンを任意のUTCオフセットで固定できます。

In [1]: from datetime import datetime, timezone, timedelta

In [2]: def force_timezone(dt, utc_offset=0):
   ...:     return dt.replace(tzinfo=timezone(timedelta(hours=utc_offset)))
   ...:

In [3]: dt = datetime(2011,8,15,8,15,12,0)

In [4]: str(dt)
Out[4]: '2011-08-15 08:15:12'

In [5]: str(force_timezone(dt, -8))
Out[5]: '2011-08-15 08:15:12-08:00'

タイムゾーンとしてtimezone(timedelta(hours=n))を使うことはここでの本当の銀の弾丸です、そしてそれは他の多くの役に立つアプリケーションを持っています。

0
tmck-code

タイムゾーン対応の日付時刻には、次のようにタイムゾーンを使用します。デフォルトはUTCです。

    from Django.utils import timezone
    today = timezone.now() 
0