代码之家  ›  专栏  ›  技术社区  ›  Thomas Vander Stichele

是否有time.gmtime()的反函数将UTC元组解析为epoch以来的秒数?

  •  19
  • Thomas Vander Stichele  · 技术社区  · 16 年前

    python的时间模块似乎有点随意。例如,这里是docstring中的方法列表:

    time() -- return current time in seconds since the Epoch as a float
    clock() -- return CPU time since process start as a float
    sleep() -- delay for a number of seconds given as a float
    gmtime() -- convert seconds since Epoch to UTC tuple
    localtime() -- convert seconds since Epoch to local time tuple
    asctime() -- convert time tuple to string
    ctime() -- convert time in seconds to string
    mktime() -- convert local time tuple to seconds since Epoch
    strftime() -- convert time tuple to string according to format specification
    strptime() -- parse string to time tuple according to format specification
    tzset() -- change the local timezone
    

    看看localtime()及其inverse mktime(),为什么gmtime()没有inverse?

    额外问题:你会给这个方法起什么名字?您将如何实现它?

    4 回复  |  直到 11 年前
        1
  •  32
  •   Community CDub    8 年前

    实际上有一个反函数,但出于某种奇怪的原因,它在 calendar 模块:calendar.timegm()。我列出了这个函数 answer .

        2
  •  4
  •   Mark Roddy    16 年前

    我一直认为时间和日期时间模块有点不连贯。总之,这里是mktime的倒数

    import time
    def mkgmtime(t):
        """Convert UTC tuple to seconds since Epoch"""
        return time.mktime(t)-time.timezone
    
        3
  •  0
  •   C. K. Young    16 年前

    我只是Python的新手,但下面是我的方法。

    def mkgmtime(fields):
        now = int(time.time())
        gmt = list(time.gmtime(now))
        gmt[8] = time.localtime(now).tm_isdst
        disp = now - time.mktime(tuple(gmt))
        return disp + time.mktime(fields)
    

    在那里,我也为函数建议了名称。:-)重新计算很重要 disp 每次,以防日光节约值发生变化或类似情况。(Jython需要转换回tuple。CPython似乎不需要它。)

    这是超级尼克,因为 time.gmtime 总是将DST标志设置为假。不过,我讨厌密码。一定有更好的方法。可能还有一些角落的箱子我还没有找到。

        4
  •  0
  •   Ilialuk    11 年前

    mktime文档在这里有点误导性,没有任何意义说它是作为本地时间计算的,而是根据提供的元组计算从epoch开始的秒数,而不管您的计算机位置如何。

    如果要将UTC元组转换为本地时间,可以执行以下操作:

    >>> time.ctime(time.time())
    'Fri Sep 13 12:40:08 2013'
    
    >>> utc_tuple = time.gmtime()
    >>> time.ctime(time.mktime(utc_tuple))
    'Fri Sep 13 10:40:11 2013'
    
    >>> time.ctime(time.mktime(utc_tuple) - time.timezone)
    'Fri Sep 13 12:40:11 2013'
    


    也许更准确的问题是如何 将UTC元组转换为本地元组 . 我会称之为 从通用到本地 (我喜欢长而描述性的名字):

    >>> time.localtime(time.mktime(utc_tuple) - time.timezone)
    time.struct_time(tm_year=2013, tm_mon=9, tm_mday=13, tm_hour=12, tm_min=40, tm_sec=11, tm_wday=4, tm_yday=256, tm_isdst=1)
    


    Validatation:

    >>> time.ctime(time.mktime(time.localtime(time.mktime(utc_tuple) - time.timezone)))
    'Fri Sep 13 12:40:11 2013'    
    

    希望这有帮助, 伊利亚