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に設定する方法はありますか?もちろん、理想的な解決策は自動的にタイムゾーンを知ることです。
標準ライブラリでは、独自のタイムゾーンクラスを作成せずに、意識したタイムゾーンを作成するためのクロスプラットフォームの方法はありません。
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を好む理由をさらに読んだり見たりすること:
特定のタイムゾーンで現在の時刻を取得します。
import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))
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.セバスチャンの答え 。
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オフセットを持つタイムゾーンの深夜を取得する 。
現在の時刻を表すタイムゾーン対応のdatetimeオブジェクトを構築するためのもう1つの方法:
import datetime
import pytz
pytz.utc.localize( datetime.datetime.utcnow() )
Djangoを使用している場合は、tzに対応していない日付を設定できます(utcのみ)。
settings.pyの以下の行にコメントを追加します。
USE_TZ = True
これは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コードでは利用できません
なぜここで説明されているように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())
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
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によると は、間違った結果をもたらす可能性があります。
あなたが現在の日付と時刻をpythonで取得している場合、あなたは現在の日付と時刻を次のように取得するでしょう。
from datetime import datetime
import pytz
import time
str(datetime.strftime(datetime.now(pytz.utc),"%Y-%m-%d %H:%M:%S%t"))
この回答を、UTC以外のタイムゾーンで頻繁に作業する人として追加しています。
独自のメソッドを持つ唯一のタイムゾーンはtimezone.utc
ですが、必要に応じてtimedelta
&timezone
を使用して強制的に.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))
を使うことはここでの本当の銀の弾丸です、そしてそれは他の多くの役に立つアプリケーションを持っています。
タイムゾーン対応の日付時刻には、次のようにタイムゾーンを使用します。デフォルトはUTCです。
from Django.utils import timezone
today = timezone.now()