8

一家特定的银行在世界所有主要城市都有分支机构。它们都在当地时间上午 10:00 开放。如果在使用 DST 的时区内,那么当地的开放时间当然也遵循 DST 调整的时间。那么我如何从本地时间转到UTC时间。

我需要的是这样的功能to_utc(localdt, tz)

论据:

  • localdt:本地时间,作为天真的日期时间对象,经过 DST 调整
  • tz:TZ 格式的时区,例如 'Europe/Berlin'

回报:

  • datetime 对象,UTC,时区感知

编辑:

最大的挑战是检测本地时间是否在一个有 DST 的时期,这也意味着它是 DST 调整的。

对于夏季 +1 DST 的“欧洲/柏林”:

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

对于没有 DST 的“非洲/拉各斯”:

  • 1 月 1 日 10:00 => 1 月 1 日 9:00 UTC
  • 7 月 1 日 10:00 => 7 月 1 日 9:00 UTC
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 回答