web-dev-qa-db-ja.com

ローカルタイムゾーンでPython datetimeを印刷するにはどうすればよいですか?

これに設定されている変数tがあるとします。

_datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>)
_

str(t)と言うと、次のようになります:

_'2009-07-10 18:44:59.193982+00:00'
_

UTCではなくローカルタイムゾーンで出力されることを除いて、同様の文字列を取得するにはどうすればよいですか?

23
mike

周りを見回すべきだと思う:datetime.astimezone()

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

Pytzモジュールも参照してください-使い方は非常に簡単です-例:

eastern = timezone('US/Eastern')

http://pytz.sourceforge.net/

例:

from datetime import datetime
import pytz
from tzlocal import get_localzone # $ pip install tzlocal

utc_dt = datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=pytz.utc)
print(utc_dt.astimezone(get_localzone())) # print local time
# -> 2009-07-10 14:44:59.193982-04:00
24

これを行う最善の方法は、_datetime.tzinfo_ドキュメントで定義されているLocalTimezoneクラスを使用することだと思います(goto http://docs.python.org/library/datetime.html# tzinfo-objects そして「tzinfoクラスの例」セクションまでスクロールダウンします):

LocalLocalTimezoneのインスタンスであると仮定します

_t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=utc)
local_t = t.astimezone(Local)
_

str(local_t)は以下を与えます:

_'2009-07-11 04:44:59.193982+10:00'
_

あなたが望むものです。

(注:私はオーストラリアのニューサウスウェールズ州にいるため、奇妙に見えるかもしれません。これは、UTCの10時間または11時間です)

10
HughE

このスクリプトは、astimezone()を使用してローカルタイムゾーンを表示するいくつかの方法を示します。

_#!/usr/bin/env python3

import pytz
from datetime import datetime, timezone
from tzlocal import get_localzone

utc_dt = datetime.now(timezone.utc)

PST = pytz.timezone('US/Pacific')
EST = pytz.timezone('US/Eastern')
JST = pytz.timezone('Asia/Tokyo')
NZST = pytz.timezone('Pacific/Auckland')

print("Pacific time {}".format(utc_dt.astimezone(PST).isoformat()))
print("Eastern time {}".format(utc_dt.astimezone(EST).isoformat()))
print("UTC time     {}".format(utc_dt.isoformat()))
print("Japan time   {}".format(utc_dt.astimezone(JST).isoformat()))

# Use astimezone() without an argument
print("Local time   {}".format(utc_dt.astimezone().isoformat()))

# Use tzlocal get_localzone
print("Local time   {}".format(utc_dt.astimezone(get_localzone()).isoformat()))

# Explicitly create a pytz timezone object
print("Local time   {}".format(utc_dt.astimezone(NZST).isoformat()))
_

次を出力します。

_$ ./timezones.py 
Pacific time 2019-02-22T17:54:14.957299-08:00
Eastern time 2019-02-22T20:54:14.957299-05:00
UTC time     2019-02-23T01:54:14.957299+00:00
Japan time   2019-02-23T10:54:14.957299+09:00
Local time   2019-02-23T14:54:14.957299+13:00
Local time   2019-02-23T14:54:14.957299+13:00
Local time   2019-02-23T14:54:14.957299+13:00
_

タイムゾーンオブジェクトなしでastimezone()を呼び出すと、デフォルトでローカルゾーンが使用されることに注意してください。つまり、tzlocalをインポートする必要はありません。 _tzlocal get_localzone_を使用する場合と比較して、これが常に安全であるかどうかは完全にはわかりません。おそらく誰かがコメントできますか?

2
htaccess

python 3.2以降、標準ライブラリ関数のみを使用:

u_tm = datetime.datetime.utcfromtimestamp(0)
l_tm = datetime.datetime.fromtimestamp(0)
l_tz = datetime.timezone(l_tm - u_tm)

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=l_tz)
str(t)
'2009-07-10 18:44:59.193982-07:00'

使用する必要があるのはl_tm - u_tmまたはu_tm - l_tm UTCから+または-時間として表示するかどうかによって異なります。私はMSTにいます。これは-07の由来です。よりスマートなコードは、どちらの方法を減算するかを理解できるはずです。

そして、ローカルタイムゾーンを一度だけ計算する必要があります。それは変わりません。少なくとも夏時間に切り替えるまで。

2
mMerlin

先日このようなものを書きました:

import time, datetime
def nowString():
    # we want something like '2007-10-18 14:00+0100'
    mytz="%+4.4d" % (time.timezone / -(60*60) * 100) # time.timezone counts westwards!
    dt  = datetime.datetime.now()
    dts = dt.strftime('%Y-%m-%d %H:%M')  # %Z (timezone) would be empty
    nowstring="%s%s" % (dts,mytz)
    return nowstring

あなたにとって興味深いのは、おそらく「mytz = ...」で始まる行でしょう。 time.timezoneは、ローカルタイムゾーンを返しますが、UTCとは反対の符号が付きます。したがって、UTC + 1を表す「-3600」と表示されます。

夏時間(DST、コメントを参照)に対する無知にもかかわらず、私はこれをtime.timezone

0
ThomasH