有没有一种简单的方法来获取Python当前时区和UTC之间的当前时差?

时间:2013-10-10 06:55:44

标签: python timezone timezone-offset

我的目的只是输出一个时区字符串,如电子邮件中使用的-0700。具体来说,我想要它反映确切的时区,包括夏令时。这意味着我将在夏季在加利福尼亚州获得-0700,在冬季在加利福尼亚州获得-0800,在中国总是+0800(无夏令时)。

我发现很难有两个原因:

  1. 与C99和普通C / C ++实现不同,Python整数除法总是四舍五入而不是零。 (这对涉及时区的计算很重要,如-xx30)。
  2. struct_time.tm_isdst和time.daylight不反映夏令时是否有效。
  3. 我最终得到了如下代码。它比我预期的要长(尤其是Python!):

    import math
    import time
    
    def my_divide(dividend, divisor):
        if dividend < 0:
            if divisor < 0:
                diff_sign = False
            else:
                diff_sign = True
        else:
            if divisor >= 0:
                diff_sign = False
            else:
                diff_sign = True
        if diff_sign:
            return (int(math.ceil(1.0 * dividend / divisor)), dividend % -divisor)
        else:
            return (int(math.floor(1.0 * dividend / divisor)), dividend % divisor)
    
    def my_timezone():
        gt = time.gmtime()
        lt = time.localtime()
        lt_write = list(lt)
        lt_write[8] = 0  # is_dst
        lt = time.struct_time(lt_write)
        seconds = time.mktime(lt) - time.mktime(gt)
        (hours, minutes) = my_divide(seconds, 3600)
        minutes = abs(minutes) // 60
        return '%(hours)+03d%(minutes)02d' % {'hours': hours, 'minutes': minutes}
    

    有没有更好的实施?

1 个答案:

答案 0 :(得分:2)

您可以使用time.timezonetime.altzone值。

这些提供:

  

本地(非DST)时区的偏移量,以UTC为单位的西秒(西欧大部分地区为负,美国为零,英国为零)

  

本地DST时区的偏移量,以UTC为单位的秒数(如果已定义)。如果当地DST时区在UTC以东(如在西欧,包括英国),则这是否定的。仅在daylight非零时才使用此项。

正如time.altzone的文档所解释的那样,当time.daylight非零时使用后者,但仅当当前时间是夏令时时才使用后者:

import time

def my_timezone():
    is_dst = time.daylight and time.localtime().tm_isdst
    offset = time.altzone if is_dst else time.timezone
    westerly = offset > 0
    minutes, seconds = divmod(abs(offset), 60)
    hours, minutes = divmod(minutes, 60)
    return '{}{:02d}{:02d}'.format('-' if westerly else '+', hours, minutes)

以秒为基础,divmod()此处不应存在舍入错误。

对于我在英国的夏季地点,这给出了:

>>> my_timezone()
'+0100'