19

エポックタイムスタンプをpytzを使用してさまざまなタイムゾーンの日付に変換する作業をしています。私がやろうとしているのは、Olsonデータベースのタイムゾーンとエポックタイムを受け入れ、ローカライズされた日時オブジェクトを返すDateTimeオブジェクトを作成することです。最終的には、「ニューヨークのエポックタイム1350663248は何時でしたか?」などの質問に答える必要があります。

ここで何かが正しく機能していません:

import datetime, pytz, time

class DateTime:
    def __init__(self, timezone, epoch):
        self.timezone = timezone
        self.epoch = epoch
        timezoneobject = pytz.timezone(timezone)
        datetimeobject = datetime.datetime.fromtimestamp( self.epoch )
        self.datetime = timezoneobject.localize(datetimeobject)

    def hour(self):
        return self.datetime.hour

if __name__=='__main__':
    epoch = time.time()
    dt = DateTime('America/Los_Angeles',epoch)
    print dt.datetime.hour
    dt = DateTime('America/New_York',epoch)
    print dt.datetime.hour

これは同じ時間を印刷しますが、1つは3時間ほど先にあるはずです。ここで何が問題になっていますか?私はPythonの完全な初心者です、どんな助けでもありがたいです!

4

3 に答える 3

34

datetime.fromtimestamp(self.epoch)任意の timezone.localize() で使用してはならない localtime を返します。utcfromtimestamp()UTC で日時を取得してから、目的のタイムゾーンに変換する必要があります。

from datetime import datetime
import pytz

# get time in UTC
utc_dt = datetime.utcfromtimestamp(posix_timestamp).replace(tzinfo=pytz.utc)

# convert it to tz
tz = pytz.timezone('America/New_York')
dt = utc_dt.astimezone(tz)

# print it
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

または、より簡単な代替手段は、タイムスタンプから直接構築することです。

from datetime import datetime
import pytz

# get time in tz
tz = pytz.timezone('America/New_York')
dt = datetime.fromtimestamp(posix_timestamp, tz)
# print it
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

この場合、UTC から暗黙的に変換されます。

于 2012-11-06T21:53:13.057 に答える
6

datetimeUNIX タイムスタンプから特定のタイムゾーンに属するオブジェクトpytzを作成tzするには、 datetime. 例えば:

>>> from datetime import datetime
>>> import pytz

>>> datetime.fromtimestamp(1350663248, tz= pytz.timezone('America/New_York'))
datetime.datetime(2012, 10, 19, 12, 14, 8, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)

pytz.all_timezones使用できるタイムゾーン名の完全なリストを返すを使用して、すべてのタイムゾーンのリストを取得できます。

List of tz database time zone wikiも参照してください。

于 2018-01-02T15:41:50.597 に答える
-3
epochdt = datetime.datetime.fromtimestamp(epoch)
timezone1 = timezone("Timezone/String")
adjusted_datetime = timezone1.localize(epochdt)

メモリから作業するので、構文エラーは許されますが、正しい軌道に乗るはずです。

編集:時間などを知ることについての部分を逃しました。Python には優れたTime/Date Formattingがあります。そのリンクのほとんどの下部には、datetime オブジェクトからさまざまな属性を取得する方法を示す表があります。

于 2012-10-19T16:28:11.960 に答える