どのように私は指定されたタイムゾーンのための「真夜中」のUTC時刻を得るのですか?

StackOverflow https://stackoverflow.com/questions/373370

質問

私は今のところ思い付くことができる最高のこの怪物です。

>>> datetime.utcnow() \
...   .replace(tzinfo=pytz.UTC) \
...   .astimezone(pytz.timezone("Australia/Melbourne")) \
...   .replace(hour=0,minute=0,second=0,microsecond=0) \
...   .astimezone(pytz.UTC) \
...   .replace(tzinfo=None)
datetime.datetime(2008, 12, 16, 13, 0)

すなわち、英語では、(UTCで)現在の時刻を取得し、他のいくつかのタイムゾーンに変換し、深夜までの時間を設定し、その後、戻ってUTCに変換します。

それは、サーバーのタイムゾーンではなく、ユーザーのタイムゾーンを使用するのと同じように私は()やlocaltime()現在使用していないよ。

私は何か、どんなアイデアが欠けてる感じ助けることができない?

役に立ちましたか?

解決

私はあなたがこのようにそれを行う場合、いくつかのメソッドの呼び出しをオフに剃ることができると思います:

>>> from datetime import datetime
>>> datetime.now(pytz.timezone("Australia/Melbourne")) \
            .replace(hour=0, minute=0, second=0, microsecond=0) \
            .astimezone(pytz.utc)

しかし...あなたのコード内の美学よりも大きな問題がある:それは夏時間へまたはからスイッチの日に間違った結果が得られます。

この理由は、日時コンストラクタもreplace()でもないが、DSTのアカウントに変わる取るということです。

>>> now = datetime(2012, 4, 1, 5, 0, 0, 0, tzinfo=pytz.timezone("Australia/Melbourne"))
>>> print now
2012-04-01 05:00:00+10:00
>>> print now.replace(hour=0)
2012-04-01 00:00:00+10:00 # wrong! midnight was at 2012-04-01 00:00:00+11:00
>>> print datetime(2012, 3, 1, 0, 0, 0, 0, tzinfo=tz)
2012-03-01 00:00:00+10:00 # wrong again!

しかし、tz.localize()状態のドキュメント:

  

この方法ではなく、localtimesを構築するために使用されるべきです   日時コンストラクタにtzinfoの引数を渡すよります。

このように、あなたの問題はそうのように解決されます:

>>> import pytz
>>> from datetime import datetime, date, time

>>> tz = pytz.timezone("Australia/Melbourne")
>>> the_date = date(2012, 4, 1) # use date.today() here

>>> midnight_without_tzinfo = datetime.combine(the_date, time())
>>> print midnight_without_tzinfo
2012-04-01 00:00:00

>>> midnight_with_tzinfo = tz.localize(midnight_without_tzinfo)
>>> print midnight_with_tzinfo
2012-04-01 00:00:00+11:00

>>> print midnight_with_tzinfo.astimezone(pytz.utc)
2012-03-31 13:00:00+00:00

1582年前の日付の保証、しかします。

他のヒント

@ホップの答えには、夏時間(DST)例えば、2012年4月1日からの移行の日に間違っています。それを修正するには tz.localize() を使用することができます:

tz = pytz.timezone("Australia/Melbourne")
today = datetime.now(tz).date()
midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=None)
utc_dt = midnight.astimezone(pytz.utc)        

コメントと同じます:

#!/usr/bin/env python
from datetime import datetime, time
import pytz # pip instal pytz

tz = pytz.timezone("Australia/Melbourne") # choose timezone

# 1. get correct date for the midnight using given timezone.
today = datetime.now(tz).date()

# 2. get midnight in the correct timezone (taking into account DST)
#NOTE: tzinfo=None and tz.localize()
# assert that there is no dst transition at midnight (`is_dst=None`)
midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=None)

# 3. convert to UTC (no need to call `utc.normalize()` due to UTC has no 
#    DST transitions)
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
print midnight.astimezone(pytz.utc).strftime(fmt)

TZ環境変数を設定すると、タイムゾーンPythonの日付と時刻関数と仕事何を修正します。

>>> time.gmtime()
(2008, 12, 17, 1, 16, 46, 2, 352, 0)
>>> time.localtime()
(2008, 12, 16, 20, 16, 47, 1, 351, 0)
>>> os.environ['TZ']='Australia/Melbourne'
>>> time.localtime()
(2008, 12, 17, 12, 16, 53, 2, 352, 1)

各タイムゾーンは番号、例えば米国/中央=を-6ています。これは、UTCからの時間のオフセットとして定義されています。 0000は深夜なので、あなたは単に、これはそれが真夜中UTCられる場合は、どの時間帯での時間を見つけるためにオフセットを使用することができます。それにアクセスするには、私はあなたが

 time.timezone

タグを使用することができると信じて

ザPythonのドキュメントのによれば、time.timezoneは、実際の負の値を与えますこの数値ます:

  
    

time.timezone

         
      

西UTCの(西ヨーロッパ、英国では米国、ゼロでは正のほとんどでは負)秒に、ローカル(非DST)のタイムゾーンのオフセット     
  
それは(それが6タイムゾーン値を持つシカゴ()で真夜中だ場合、すなわち、それは6000 =午前6時のUTCです)ポジティブだ場合は、

ですから、単に時間の時間のためにその番号を使用することになります。

数値が負の場合、例えば24から引く

、ベルリンは、-1与えるので24 - 。1 => 2300 = 23時

このはpytzよりdateutil.tzとより簡単です。

>>>import datetime
>>>import dateutil.tz
>>>midnight=(datetime.datetime
             .now(dateutil.tz.gettz('Australia/Melbourne'))
             .replace(hour=0, minute=0, second=0, microsecond=0)
             .astimezone(dateutil.tz.tzutc()))
>>>print(midnight)
2019-04-26 14:00:00+00:00

tzinfoのドキュメントには、Python以来dateutil.tz推奨しています3.6。 dateutil.tzからtzinfoのオブジェクトがpytzのローカライズ機能を必要とせずにDSTのような異常で問題はありません。 user3850から例を使用します:

>>> now = (datetime.datetime(2012, 4, 1, 5,  
...         tzinfo = dateutil.tz.gettz('Australia/Melbourne'))) 
>>> print(now.replace(hour = 0).astimezone(dateutil.tz.tzutc()))
2012-03-31 13:00:00+00:00
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top