通过提供国家/地区名称和细分,将UTC转换为当地时间

时间:2015-04-07 16:19:31

标签: python datetime utc

我有一个cvs文件,其格式包括UTC时区的日期时间:2014-04-19 03:39:02.000。我使用parser.parse来读取日期时间。 我有国名和细分。我想根据国家和细分将此日期时间数据转换为本地时区。

csv文件内容(UTC):us la 2014-04-19 03:39:02.000

本案例的本地日期时间(UTC-6):2014-04-18 21:39:02.000

所以我有一个叫做元素的对象。我想计算本地日期时间

element.country='us'
element.subdivision='la'
element.date_time_utc=parser.parse(split_line[13].strip())
element.date_time_local

2 个答案:

答案 0 :(得分:2)

要从给定国家/地区和细分的tz数据库中查找时区,您可以尝试使用地理编码器,例如geopy

#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
from geopy import geocoders # $ pip install geopy

# find timezone given country and subdivision
g = geocoders.GoogleV3()
place, (lat, lng) = g.geocode('us/la')
timezone = g.timezone((lat, lng))

# parse rfc3339-like format
utc_dt = datetime.strptime('2014-04-19 03:39:02.000', '%Y-%m-%d %H:%M:%S.%f')

# convert utc to the given timezone
dt = timezone.fromutc(utc_dt)
# -> datetime.datetime(2014, 4, 18, 22, 39, 2,
#        tzinfo=<DstTzInfo 'America/Chicago' CDT-1 day, 19:00:00 DST>)

place被确定为Louisiana, USA(如果'la'表示美国的状态,则正确),因此时间是 2014-04-18T22:39:02-05:00(不是21:39) - DST生效(自2014年3月9日至11月2日)。

答案 1 :(得分:1)

这是ISO 8601格式。

In: dt = dateutil.parser.parse('2014-04-19 03:39:02.0000')
In: dt
Out: datetime.datetime(2014, 4, 19, 3, 39, 2)

In: pytz.timezone('US/Pacific').fromutc(dt)
Out: datetime.datetime(2014, 4, 18, 20, 39, 2, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

您唯一需要的是将“细分”映射到已知时区。或位置。

pytz.all_timezones

是您的参考。

或者可能是http://www.geonames.org/export/web-services.html