Почему преобразование времени между секундами эпохи и строкой меняет время на 1 календарный год?

Я использую модуль времени python3 для преобразования времени между секундами и форматированной строкой. Функции Python, используемые для генерации строки, — это localtime и strftime. Чтобы сгенерировать время в секундах, я использую объединение строк, за которым следует mktime. Поскольку я вызываю их повторно для каждого результата, изменяется только год, всегда увеличивая секунды на полный год. Используемый код приведен ниже:

import time

def time_string(t):
    #t is second obtained by time.mktime((yr, mn, dy, hr, mn, sec, 0, 0, 0))
    time_struct = time.localtime(t)
    time_string = time.strftime("%Y-%m-%d %H:%M:%S", time_struct)
    return time_string

def string_time(t_string):
    #t_string has format '2020-01-31 08:23:35'
    yr = int(t_string[:4])
    mn = int(t_string[5:7])
    dy = int(t_string[8:10])
    hr = int(t_string[11:13])
    mn = int(t_string[14:16])
    se = int(t_string[17:])
    t=int(time.mktime((yr, mn, dy, hr, mn, se, 0, 0, 0)))
    return t

t = int(time.mktime((2020, 3, 19, 18, 15, 20, 0, 0, 0)))
print (t)
for x in range(5):
        t_st = time_string(t)
        print(t_st)
        t = string_time(t_st)
        print(t)

sys.exit("stopping..")

Результаты, которые я получаю от выполнения кода выше, следующие:

1584621920
2020-03-19 18:15:20
1616157920
2021-03-19 18:15:20
1647693920
2022-03-19 18:15:20
1679229920
2023-03-19 18:15:20
1710852320
2024-03-19 18:15:20
1742388320
SystemExit: stopping..

Что я делаю не так? Почему это происходит? Как лучше преобразовать строку времени в секунды?


person Ani    schedule 25.03.2020    source источник


Ответы (2)


Я не понимаю цели вопроса, так что вы на самом деле пытаетесь сделать, однако, если у вас есть строка времени, и вы хотите получить ее секунды, попробуйте использовать datetime.timestamp() вместо a сращивание строк времени...

Ваш код увеличивается за год на единицу, потому что в вашем методе string_time(t_string) вы устанавливаете переменную mn дважды! Один раз при mn = int(t_string[5:7]) и один раз при mn = int(t_string[14:16]), что приведет к месяцу 15, который адаптирует год на 1 год и 3 месяца, что приведет к в течение одного года для вас

person Korbinian Reiner    schedule 25.03.2020
comment
Спасибо, Корбиниан - это довольно глупая ошибка с именами переменных. Я использовал время вместо модуля datetime, но попробую использовать datetime, если это проще - person Ani; 25.03.2020

Найдено time.strptime для решения проблемы обратного преобразования из строки с помощью правильных средств форматирования. Следующий код устранил необходимость объединения строк.

def string_time(t_string):
    #t_string has format '2020-01-31 08:23:35'
    t_struct = time.strptime(t_string,"%Y-%m-%d %H:%M:%S")
    t = int(time.mktime(t_struct))
    return t

Корбинян уже нашел ошибку в моем коде. Есть ли причина, по которой я должен использовать модуль datetime вместо модуля даты?

person Ani    schedule 25.03.2020