回答:
つまり、それはタイムゾーンナイーブであるため、次のものでは使用できません。 datetime.astimezone
このようなタイムゾーンを与えることができます
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
タイムゾーンを変更できるようになりました
print(u.astimezone(pytz.timezone("America/New_York")))
特定のタイムゾーンの現在の時刻を取得するには、tzinfoをdatetime.now()
直接渡すことができます。
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
これは、夏時間(DST)を監視するタイムゾーンを含むすべてのタイムゾーンで機能します。つまり、異なる時間で異なるutcオフセット(非固定utcオフセット)を持つ可能性があるタイムゾーンで機能します。使用しないでくださいtz.localize(datetime.now())
。ローカル時間が不明確な場合、DST終了時の移行中に失敗する可能性があります。
astimezone
。したがって、datetimeにはネイティブのタイムゾーンがないだけでなく、広く利用可能な唯一のtzinfoの実装は、想定されている標準に準拠していません。
u=datetime.now(pytz.utc)
tz.localize(datetime.now())
。datetime.now(tz)
代わりに使用してください。
Python 3.2以降の場合、datetime
モジュールにはが含まれていることに注意してくださいdatetime.timezone
。のドキュメントはdatetime.utcnow()
言う:
を呼び出すことで、現在のUTCの日時を知ることができます。
datetime.now
(
timezone.utc
)
だからあなたはできる:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)
またはdatetime.utcnow(timezone.utc)
?
datetime.utcnow()
引数は取りません。だからそれはする必要がありますdatetime.now(timezone.utc)
。
datetime.now()
マシン時刻datetime.utcnow()
を返しますが、実際のUTC時刻を返します。
datetime.utcnow()
設定されtzinfo
ていません。しかし、セットでdatetime.now(datetime.timezone.utc)
UTC時間を 返しtzinfo
ます。
tz
、現在のコンストラクタでオブジェクトを渡すと、そのタイムゾーンの時刻が返されますか?OK!ご指摘ありがとうございます。
標準のPythonライブラリには、tzinfoクラスは含まれていません(ただし、pep 431を参照してください)。私はその理由を推測することしかできません。個人的には、UTCのtzinfoクラスを含めないのは間違いだったと思います。標準の実装を実装するのに十分な議論の余地があるからです。
編集:ライブラリには実装はありませんが、tzinfo
ドキュメントに例として記載されているものがあります。
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
これを使用するには、現在の時刻を認識できる日時オブジェクトとして取得します。
from datetime import datetime
now = datetime.now(utc)
ありdatetime.timezone.utc
3.2+ Pythonで:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetime
によって作成されたオブジェクトutcnow()
)...
timezone.utc
がPython 3.2に追加されました。下位互換性のためにutcnow()
、タイムゾーンのない時間オブジェクトを返しますが、を呼び出すことで必要なものを取得できますnow(timezone.utc)
。
struct
ます- モジュールはUnicodeからバイト文字列への自動変換を行い、最終的な決定は以前のPython 3バージョンとの互換性を壊して先の悪い決定を防ぐことでした。
tzinfo
ドキュメントにはそれを実装するためのコードの例が含まれていることに戸惑っていますが、datetime自体にはその機能が含まれていません。 docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz
素晴らしいリソースです。回答を編集してサンプルコードを挿入するまでに、他の誰かがすでにそれを提案しており、私は彼らの雷を盗んだくありませんでした。
pytz
モジュールは一つの選択肢であり、別の存在であるpython-dateutil
が、また、サードパーティ製のパッケージであるが、すでに他の依存関係およびオペレーティング・システムに応じて利用できます。
参照用にこの方法論を含めたかっただけです。すでにpython-dateutil
他の目的でインストールしている場合は、次の方法tzinfo
で複製する代わりに、この方法を使用できます。pytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
への呼び出しにutcnow
UTCタイムゾーン情報を含める必要があることに同意します。ネイティブの日時ライブラリはデフォルトで相互互換性のために単純な日時に設定されているため、これは含まれていないと思います。
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)
、常に機能します。datetime.now(dateutil.tz.tzlocal())
DSTの移行中に失敗することがあります。PEP 495-現地時間の明確化dateutil
により、将来状況が改善される可能性があります。
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())
(注:dateutil
固定されていないutcオフセット(などdateutil.tz.tzlocal()
)を使用すると、pytz
ここで失敗する可能性があります。代わりに - ベースのソリューションを使用してください)。
dateutil
れていたので、dateutil.parser
このソリューションが一番気に入りました。それは次のように単純utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc())
でした。ビオラ!!
Julien Danjouが、タイムゾーンに対処してはならない理由を説明する優れた記事を書きました。抜粋:
実際、Python datetime APIは常に認識されないdatetimeオブジェクトを返しますが、これは非常に残念です。実際、このオブジェクトの1つを取得するとすぐに、タイムゾーンが何であるかを知る方法がなくなります。したがって、これらのオブジェクトは、それ自体ではかなり「役に立たない」ものです。
残念ながら、を使用しても、utcnow()
発見したようにタイムゾーン情報は表示されません。
推奨事項:
常に認識している
datetime
オブジェクト、つまりタイムゾーン情報を使用します。これにより、それらを直接比較でき(認識datetime
オブジェクトと非認識オブジェクトは比較できません)、ユーザーに正しく返されます。活用pytzタイムゾーンオブジェクトを持っています。入力および出力文字列形式としてISO 8601を使用します。使用
datetime.datetime.isoformat()
列はタイムゾーン情報が含まれていることをフォーマットを使用してフォーマットとしてタイムスタンプを返します。ISO 8601形式のタイムスタンプを含む文字列を解析する必要がある場合は、に依存でき
iso8601
ます。これは、正しいタイムゾーン情報を含むタイムスタンプを返します。これにより、タイムスタンプを直接比較できます。
timezone
Python 3.2以降で情報を追加するには
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone'
Python 2.7.13(デフォルト、2017年1月19日、14:48:08)
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
UTC日付はUTCであるため、タイムゾーン情報を必要としません。これは、定義上、オフセットがないことを意味します。
pytz.utc
)。UTCからのオフセットが不明な値と、0であることがわかっている値との間には大きな違いがあることに注意してください。後者はIMO utcnow()
を返す必要があります。これは、ドキュメンテーションによると、「解釈に開かれていない特定の瞬間を表すために、認識されたオブジェクトが使用される」と一致します。