Подтвердить что ты не робот

Есть ли обратная функция для time.gmtime(), которая анализирует UTC-кортеж в секундах с момента эпохи?

Модуль времени 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() и его обратное mktime(), почему нет никакого обратного для gmtime()?

Бонусные вопросы: что бы вы назвали методом? Как вы его реализуете?

4b9b3361

Ответ 1

На самом деле есть обратная функция, но по какой-то причудливой причине она находится в модуле calendar: calendar.timegm(). Я перечислил функции в этом ответе.

Ответ 2

Я всегда думал, что модули времени и даты и времени были немного некогерентными. В любом случае, здесь обратный mktime

import time
def mkgmtime(t):
    """Convert UTC tuple to seconds since Epoch"""
    return time.mktime(t)-time.timezone

Ответ 3

Я только новичок на 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 требуется преобразование обратно в кортеж. CPython, похоже, не требует его.)

Это супер ick, потому что time.gmtime всегда устанавливает флаг DST в значение false. Я ненавижу код. Там должен быть лучший способ сделать это. И, вероятно, есть некоторые угловые случаи, которые у меня еще нет.

Ответ 4

Документация mktime немного вводит в заблуждение здесь, нет смысла говорить, что она рассчитывается как локальное время, а вычисляет секунды из Epoch в соответствии с предоставленным кортежем - независимо от вашего локального компьютера.

Если вы хотите сделать преобразование из utc_tuple в локальное время, вы можете сделать следующее:

>>> 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_tuple в local_tuple. Я бы назвал его gm_tuple_to_local_tuple (я предпочитаю длинные и описательные имена):

>>> 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'    

Надеюсь, это поможет, Ша.