В общем, чтобы преобразовать произвольную дату / время с учетом часового пояса в наивную (локальную) дату и время, я бы использовал модуль pytz
и astimezone
для преобразования в местное время, а replace
, чтобы сделать дату / время наивным :
In [76]: import pytz
In [77]: est=pytz.timezone('US/Eastern')
In [78]: d.astimezone(est)
Out[78]: datetime.datetime(2010, 10, 30, 13, 21, 12, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
In [79]: d.astimezone(est).replace(tzinfo=None)
Out[79]: datetime.datetime(2010, 10, 30, 13, 21, 12)
Но так как ваша конкретная дата и время, похоже, находятся в часовом поясе UTC, вы можете сделать это вместо этого:
In [65]: d
Out[65]: datetime.datetime(2010, 10, 30, 17, 21, 12, tzinfo=tzutc())
In [66]: import datetime
In [67]: import calendar
In [68]: datetime.datetime.fromtimestamp(calendar.timegm(d.timetuple()))
Out[68]: datetime.datetime(2010, 10, 30, 13, 21, 12)
Кстати, вам может быть лучше хранить даты-даты как наивные даты UTC вместо наивных локальных дат-времени. Таким образом, ваши данные не зависят от местного времени, и вы конвертируете их в местное время или любой другой часовой пояс только в случае необходимости. В некотором роде аналогичен максимально возможной работе в Юникоде и кодированию только при необходимости.
Так что, если вы согласны с тем, что хранение даты и времени в наивном UTC является лучшим способом, тогда все, что вам нужно сделать, это определить:
local_d = d.replace(tzinfo=None)