Почему преобразование времени между секундами эпохи и временем смены строки на 1 календарный год? - PullRequest
0 голосов
/ 25 марта 2020

Я использую модуль времени 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..

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

Ответы [ 2 ]

0 голосов
/ 25 марта 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 вместо модуля date?

0 голосов
/ 25 марта 2020

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

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

...