Python - 从DST调整的本地时间到UTC

时间:2011-07-23 15:34:16

标签: python timezone utc dst pytz

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

我需要的是这样的函数to_utc(localdt, tz)

参数:

  • localdt:localtime,as naive datetime object,DST-adjusted
  • tz:TZ格式的时区,例如: '欧洲/柏林'

返回:

  • 日期时间对象,UTC,时区感知

编辑:

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

对于夏季+1 DST的'Europe / Berlin':

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

对于没有夏令时的'非洲/拉各斯':

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

2 个答案:

答案 0 :(得分:8)

使用pytz,特别是localize method

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

答案 1 :(得分: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日期时间。