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



某银行在世界各大城市都设有分行。它们都在当地时间上午10点开门。如果在使用夏令时的时区内,那么当然本地的开始时间也遵循夏令时调整后的时间。那么如何从本地时间转换到utc时间呢?

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

参数:

  • localdt: localtime,作为初始datetime对象,dst调整
  • tz: tz格式的时区,例如:"欧洲/柏林"

的回报:

  • datetime对象,在UTC中,时区感知
编辑:

最大的挑战是检测本地时间是否在夏令时周期内,这也意味着它是调整后的夏令时。

对于夏季实行+1夏时制的'Europe/Berlin':

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

对于没有夏令时的'Africa/Lagos':

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

使用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
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日期时间。

相关内容

  • 没有找到相关文章

最新更新