在时区之间转换DateTimes

时间:2017-06-05 18:51:49

标签: python datetime

这让我很困惑。我已经尝试过多种方式将日期时间字符串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

1 个答案:

答案 0 :(得分:1)

虽然arrow是一个很好的库,但我们并不需要它。相反,我们会使用datetimepytz。关键要素是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