1

関連するタイムゾーン ID (TZID=America/Los_Angeles) を持つ「20111014T090000」という形式の文字列があり、これを適切なオフセットを使用して秒単位の UTC 時間に変換したいと考えています。

問題は、出力時間が 1 時間ずれているようです (PDT である必要がある場合は PST にあります)。pytz を使用して timezo を支援しています。

import pytz

def convert_to_utc(date_time)
    # date_time set to '2011-10-14 09:00:00' and is initially unaware of timezone information

    timezone_id = 'America/Los_Angeles'
    tz = pytz.timezone(timezone_id);

    # attach the timezone
    date_time = date_time.replace(tzinfo=tz);

    print("replaced: %s" % date_time);                                                                          
    # this makes date_time to be: 2011-10-14 09:00:00-08:00
    # even though the offset should be -7 at the present time

    print("tzname: %s" % date_time.tzname());
    # tzname reports PST when it should be PDT

    print("timetz: %s" % date_time.timetz());
    # timetz: 09:00:00-08:00 - expecting offset -7

    date_time_ms = int(time.mktime(date_time.utctimetuple())); 
    # returns '1318611600' which is 
    # GMT: Fri, 14 Oct 2011 17:00:00 GMT
    # Local: Fri Oct 14 2011 10:00:00 GMT-7

    # when expecting: '1318608000' seconds, which is
    # GMT: Fri, 14 Oct 2011 16:00:00 GMT
    # Local: Fri Oct 14 2011 9:00:00 GMT-7 -- expected value

タイムゾーン ID に基づいて正しいオフセットを取得するにはどうすればよいですか?

4

4 に答える 4

3

次のスニペットは、あなたが望むことを行います

def convert(dte, fromZone, toZone):
    fromZone, toZone = pytz.timezone(fromZone), pytz.timezone(toZone)
    return fromZone.localize(dte, is_dst=True).astimezone(toZone)

ここで重要な部分はis_dst、localize メソッドに渡すことです。

于 2011-09-27T04:53:53.480 に答える
0

プログラムでグローバル タイム ゾーンの変更が (一時的に) 許可されている場合は、次のようにすることもできます。

os.environ['TZ'] = 'America/Los_Angeles'
t = [2011, 10, 14, 9, 0, 0, 0, 0, -1]
return time.mktime(time.struct_time(t))

予想される 1318608000.0 が返されます。

于 2013-10-10T07:19:43.243 に答える
0

指定された文字列を単純な日時オブジェクトに変換するには:

>>> from datetime import datetime
>>> naive_dt = datetime.strptime('20111014T090000', '%Y%m%dT%H%M%S')
>>> naive_dt
datetime.datetime(2011, 10, 14, 9, 0)

タイムゾーンをアタッチするには (対応する日時オブジェクトにします):

>>> import pytz
>>> tz = pytz.timezone('America/Los_Angeles')
>>> local_dt = tz.localize(naive_dt, is_dst=None)
>>> print(local_dt.strftime("%Y-%m-%d %H:%M:%S %Z%z"))
2011-10-14 09:00:00 PDT-0700

注:is_dst=Noneは、存在しないかあいまいな現地時間の例外を発生させるために使用されます。

対応する日時オブジェクトから POSIX タイムスタンプを取得するには:

>>> (local_dt - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
1318608000.0

あなたの質問の主な問題は次のとおりです。

  1. tzinfo属性を置き換えます。tz.localize代わりに使用する必要があります
  2. mktime()UTC ではなく、現地時間 (コンピューターのタイムゾーン) で動作します。
于 2014-03-27T08:48:03.813 に答える
0

simple-dateは、この簡単な変換を行うために作成されました (これにはバージョン 0.2.1 以降が必要です)。

>>> from simpledate import *
>>> SimpleDate('20111014T090000', tz='America/Los_Angeles').timestamp
1318608000.0
于 2013-06-23T01:32:47.803 に答える