某银行在世界各大城市都设有分行。它们都在当地时间上午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日期时间。