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

Eri*_*sen 7 python timezone utc pytz dst

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

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

参数:

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

返回:

  • datetime对象,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

对于没有DST的'Africa/Lagos':

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

unu*_*tbu 8

使用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')))
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)

  • 注意:当地的一些时间不明确.虽然在DST过渡期间银行不太可能开通; 你可以使用``is_dst = None`参数来断言`.localize()`来断言. (2认同)