转换和格式化时区

时间:2019-02-12 17:21:16

标签: python timezone pytz

我正在处理我最糟糕的噩梦-时区和DST。我已经阅读了很多关于stackoverflow的文章,但是我仍然无法弄清楚。这是问题所在: 我正在针对需要一天的UTC数据进行API请求,但是我使用的系统需要在美国/太平洋时间进行请求。该文档说:

  • 报告范围过滤支持时区,但所有响应均以美国太平洋时区返回,请相应调整夏令时结束时间。

  • DST开始后的API调用应附加-07:00,DST结束后应附加-08:00

  • 2018年夏令时从2018年3月11日星期日凌晨2点开始。

      3月11日之前的
    • API调用应具有以下语法:&start=2017-03-10T00:00:00-08:00&end=2017-03-10T23:59:59-08:00

    • 夏令时的实际一天的API调用应具有以下语法:&start=2018-03-11T00:00:00-08:00&end=2017-03-11T23:59:59-07:00

除了令人困惑的2017和2018混合,没有实际参数指定所需的时区,但您必须调整以下格式的数据:2018-03-11T00:00:00-08:00

对我来说,它看起来像是一种ISO格式,但是我花了很多时间试图获得yyyy-MM-dd'T'HH:mm:ssXXX而不是'yyyy-MM-dd'T'HH:mm:ss.SSSXXX',但无法完成这项工作。因此,我创建了以下解决方法:

def dst_calc(single_date):
    zone = pytz.timezone("US/Pacific")
    day = single_date.strftime("%Y-%m-%d")

    tdelta_1 = datetime.strptime('2:00:00', '%H:%M:%S') - datetime.strptime('1:00:00', '%H:%M:%S')
    tdelta_0 = datetime.strptime('1:00:00', '%H:%M:%S') - datetime.strptime('1:00:00', '%H:%M:%S')

    logger.info('check for DST')
    if zone.localize(datetime(single_date.year, single_date.month, single_date.day)).dst() == tdelta_1:
        logger.info('summertime')
        start = single_date.strftime("%Y-%m-%d") + "T00:00:00-07:00"
        end = single_date.strftime("%Y-%m-%d") + "T23:59:59-07:00"
    elif zone.localize(datetime(single_date.year, single_date.month, single_date.day) + timedelta(days=1)).dst() == tdelta_1:
        logger.info('beginning of summertime')
        start = single_date.strftime("%Y-%m-%d") + "T00:00:00-08:00"
        end = single_date.strftime("%Y-%m-%d") + "T23:59:59-07:00"
    elif zone.localize(datetime(single_date.year, single_date.month, single_date.day)).dst() == tdelta_0:
        logger.info('wintertime')
        start = single_date.strftime("%Y-%m-%d") + "T00:00:00-08:00"
        end = single_date.strftime("%Y-%m-%d") + "T23:59:59-08:00"

很明显,这仅在美国/太平洋时区,要获得UTC日期,我需要从开始和8个时间戳中减去8h差,即T16:00:00-08:00,但我想知道是否有更好的方法/打包/可以做到这一点的格式化程序是一种更符合逻辑的方法。

1 个答案:

答案 0 :(得分:1)

您可以使用日期时间的astimezone方法来确定正确的小时数。

import datetime, pytz
now = datetime.datetime.now() # datetime.datetime(2019, 2, 12, 17, 0, 0, 0)

now.astimezone(pytz.utc)
# datetime.datetime(2019, 2, 12, 16, 0, 0, 0, tzinfo=<UTC>)

now.astimezone(pytz.timezone('US/Pacific'))
# datetime.datetime(2019, 2, 12, 8, 0, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)