3

このように、リクエストで任意の日時オブジェクトを受け取ったとしましょう。これは、可能なタイムゾーンから来ている可能性があります-どのタイムゾーンかわかりません。例として、東海岸から来たとします。

import pytz
from colander import iso8601
...
    ests1 = iso8601.parse_date('2016-04-01T00:00:00.0000-04:00')

ests1 が入ってくるオブジェクトであるふりをします

pytz を使用すると、タイムゾーンについて少し知ることができます

    etz = ests1.timetz()  # 00:00:00-04:00
    etzi = ests1.tzinfo   # <FixedOffset '-04:00' datetime.timedelta(-1, 72000)>
    etzn = ests1.tzname() # '-04:00'  # EST
    edst = ests1.dst()    #  '0:00:00'

ests1 の日付に関係なく、dst() は常に同じ値を返すように見えることに注意してください。

私はこのようなことをしたいと思います:

    psts1 = pytz.timezone(etzn
                     ).localize(dtime.datetime.fromtimestamp(ests1)
                     ).astimezone(pytz.timezone('US/Pacific'))

しかし、それは結果として

UnknownTimeZoneError: '-04:00'

私もこれを試しました:

def convert_dt_to_pstz(dt):
    pstoffset = -25200 # -7 * 60 * 60   - but what about DST?  how do we tell which offset to use? -8 or -7
    return dt.astimezone(tzoffset(None,pstoffset)) # convert to PST

しかし、それに関する問題は、日付を夏時間に合わせて調整する必要があるかどうかを判断する方法がわからないことです。

私もこれを試しました:

    utc_date = ests1.astimezone(pytz.utc)   # 2016-04-01T04:00:00+00:00
    ptz = pytz.timezone('US/Pacific')
    new_date = utc_date.replace(tzinfo=ptz) # 2016-04-01T04:00:00-07:53

しかし、new_date: -07:53 ?? の奇妙な結果を見てください。

「今」に対応する情報やサーバーの場所はどこにでもある可能性があるため、使用できないことに注意してください

4

2 に答える 2

3

タイムゾーン対応datetimeオブジェクトを別のタイムゾーンに変換するには、 methodを使用datetime.astimezone()します:

pacific_time = ests1.astimezone(pytz.timezone('US/Pacific'))

一般に、pytzドキュメントは結果を呼び出すことを推奨していますが、タイムゾーンには固定の utc オフセットがあるpytz.timezone('US/Pacific').normalize()ため、ここでは必要ありません。ests1

于 2016-04-01T19:51:44.773 に答える
0

今回はうまくいったと思います:

from datetime import datetime as dtime
import pytz
from colander import iso8601

ests1 = iso8601.parse_date('2016-04-01T00:00:00.0000-04:00')
epoch = dtime(1970, 1, 1, tzinfo=pytz.UTC)          # 1970-01-01T00:00:00+00:00
ept = (ests1 - epoch).total_seconds()               # 1459483200.0

utc_date = dtime.fromtimestamp(ept, tz=pytz.UTC)    # 2016-04-01T04:00:00+00:00
ptz = pytz.timezone('US/Pacific')
pst_date = dtime.fromtimestamp(ept, tz=ptz)         # 2016-03-31T21:00:00-07:00

ests2 = iso8601.parse_date('2016-02-01T00:00:00.0000-04:00')
ept2 = (ests2 - epoch).total_seconds()              # 1454299200.00

utc_date2 = dtime.fromtimestamp(ept2, tz=pytz.UTC)  # 2016-02-01T04:00:00+00:00
pst_date2 = dtime.fromtimestamp(ept2, tz=ptz)       # 2016-01-31T20:00:00-08:00

だから、それは次のように簡単なようです

def convert_to_tz(dt,tz_new):
   seconds = (dt - epoch).total_seconds()
   return dtime.fromtimestamp(seconds, tz=tz_new)
于 2016-04-01T18:20:36.283 に答える