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

Python кажется немного случайным. Например, вот список методов из строки документации:

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 ()?

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

Ответы [ 4 ]

33 голосов
/ 02 октября 2008

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

4 голосов
/ 25 сентября 2008

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

import time
def mkgmtime(t):
    """Convert UTC tuple to seconds since Epoch"""
    return time.mktime(t)-time.timezone
0 голосов
/ 13 сентября 2013

Документация 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'    

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

0 голосов
/ 25 сентября 2008

Я только новичок в 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 этого не требует.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...