8

特定の銀行は、世界のすべての主要都市に支店を持っています。それらはすべて現地時間の午前10時に開きます。DSTを使用するタイムゾーン内の場合、もちろん、ローカルの営業時間もDSTで調整された時間に従います。では、現地時間からUTC時間に移動するにはどうすればよいですか。

私が必要としているのは、次のto_utc(localdt, tz)ような関数です。

引数:

  • localdt:localtime、ナイーブ日時オブジェクトとして、DST調整済み
  • tz:TZ形式のタイムゾーン(例:「ヨーロッパ/ベルリン」)

戻り値:

  • 日時オブジェクト、UTC、タイムゾーン対応

編集:

最大の課題は、現地時間がDSTの期間内にあるかどうかを検出することです。これは、DSTが調整されていることも意味します。

夏時間に+1のDSTを持つ「ヨーロッパ/ベルリン」の場合:

  • 1月1日10:00=>1月1日9:00UTC
  • 7月1日10:00=>7月1日8:00UTC

DSTがない「アフリカ/ラゴス」の場合:

  • 1月1日10:00=>1月1日9:00UTC
  • 7月1日10:00=>7月1日9:00UTC
4

2 に答える 2

9

pytz 、特にそのlocalize メソッドの使用:

import pytz
import datetime as dt

def to_utc(localdt,tz):
    timezone=pytz.timezone(tz)
    utc=pytz.utc
    return timezone.localize(localdt).astimezone(utc)

if __name__=='__main__':
    for tz in ('Europe/Berlin','Africa/Lagos'):
        for date in (dt.datetime(2011,1,1,10,0,0),
                 dt.datetime(2011,7,1,10,0,0),
                 ):
            print('{tz:15} {l} --> {u}'.format(
                tz=tz,
                l=date.strftime('%b %d %H:%M'),
                u=to_utc(date,tz).strftime('%b %d %H:%M %Z')))

収量

Europe/Berlin   Jan 01 10:00 --> Jan 01 09:00 UTC
Europe/Berlin   Jul 01 10:00 --> Jul 01 08:00 UTC
Africa/Lagos    Jan 01 10:00 --> Jan 01 09:00 UTC
Africa/Lagos    Jul 01 10:00 --> Jul 01 09:00 UTC
于 2011-07-23T18:09:41.367 に答える
1
from datetime import datetime, tzinfo, timedelta

class GMT1(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=1)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self,dt):
        return "Europe/Prague"
year, month, day = 2011, 7, 23
dt = datetime(year, month, day, 10)

class UTC(tzinfo):
    def utcoffset(self, dt):
        return timedelta(0)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self,dt):
        return "UTC"

def utc(localt, tz):
    return localt.replace(tzinfo=tz).astimezone(UTC())

print utc(dt, GMT1())

新しいバージョン。これはあなたが望むことをします - 単純な日時とタイムゾーンを取り、UTC 日時を返します。

于 2011-07-23T15:53:06.633 に答える