这让我很困惑。我已经尝试过多种方式将日期时间字符串2017-06-04 00:00:00 (America/New_York)
转换为Europe/London
时区,我相信当前的夏令时是早上6点?
日期和转换的整个概念让我感到困惑,我似乎只是误解了,或者没有得到简单的原则,这张图片展示了我现有的代码以及我得到的结果。
我只是希望能够提供一个函数,一个datetime
字符串以及它所属的时区,并给它一个我想要的时区并获得调整后的datetime
的字符串,但我得到的东西是4分钟等等。
from datetime import datetime
import pytz
import arrow
#Calc Timezone Offsets
def adjust_timezone(datetime_string, input_tz, output_tz, formatter="%Y-%m-
%d %H:%M:%S"):
print datetime_string
# Now we make datetime naive datetime
date_to_convert = datetime.strptime(datetime_string, formatter)
a = arrow.get(datetime_string, 'YYYY-M-D HH:mm:ss').replace(tzinfo=pytz.utc)
print a.to(output_tz).format('YYYY-M-D HH:mm:ss')
# Make it tz aware
date_to_convert = date_to_convert.replace(tzinfo=pytz.timezone(input_tz))
print date_to_convert
date_to_convert = date_to_convert.astimezone(pytz.timezone(input_tz))
print date_to_convert
# Convert it
output_datetime = date_to_convert.astimezone(pytz.timezone(output_tz))
print output_datetime
# Make tz unaware again
output_datetime = output_datetime.replace(tzinfo=None)
return str(output_datetime)
print adjust_timezone('2017-06-04 00:00:00', "America/New_York", "Europe/London")
以上运行时返回以下结果:
2017-06-04 00:00:00
2017-6-4 01:00:00
2017-06-04 00:00:00-04:56
2017-06-04 00:00:00-04:56
2017-06-04 05:56:00+01:00
2017-06-04 05:56:00
答案 0 :(得分:1)
虽然arrow
是一个很好的库,但我们并不需要它。相反,我们会使用datetime
和pytz
。关键要素是pytz.timezone().localize()
和datetime.datetime.astimezone()
def adjust_timezone(datetime_string, input_tz, output_tz,
formatter="%Y-%m-%d %H:%M:%S"):
# Now we make datetime naive datetime
naive = dt.datetime.strptime(datetime_string, formatter)
# this time stamp is from the input_tz
with_input_tz = pytz.timezone(input_tz).localize(naive)
# now express the timestamp as output_tz
with_output_tz = with_input_tz.astimezone(pytz.timezone(output_tz))
return with_output_tz
import datetime as dt
import pytz
print(adjust_timezone(
'2017-06-04 00:00:00', "America/New_York", "Europe/London"))
2017-06-04 05:00:00+01:00