Как получить временную метку(timestamp) из набора байт
Есть временная метка размером 8 байт, полученная путем чтения данных из файла. Необходимо ее преобразовать в datetime.
ts = b'\x13\x88\x5B\xFF\xF3\x91\x34\x16'
Что пробовал и не подошло:
- преобразование метки в int и передача в fromtimestamp(и utcfromtimestamp)
ts = b'\x13\x88\x5B\xFF\xF3\x91\x34\x16'
int_ts = int.from_bytes(ts, byteorder='little')
a = datetime.datetime.fromtimestamp(int_ts)
библиотека struct
recoverbinstamp = struct.unpack('<L', ts)[0] recovernow = datetime.datetime.fromtimestamp(recoverbinstamp)```
Как я понял, временная метка хранит в себе количество секунд и миллисекунд. Может их как-то вручную можно извлечь или преобразовать.
Ответы (2 шт):
import struct
byte_range = b'\x13\x88\x5B\xFF\xF3\x91\x34\x16'
a = struct.unpack_from('!HBBBBB', byte_range)
print(a)
>>> (5000, 91, 255, 243, 145, 52)
byte_range = b'\x07\xe3\n\n\x04\n\x0f\x00\x00\x00<\x00'
>>> (2019, 10, 10, 4, 10, 15)
очень странная у вас временная метка
Форма кортежа datetime (year, month, day, hour, minute, second, ...).
Глядя на размер каждого символа формата и зная, насколько велика каждая часть datetime, вы можете выяснить, какой символ формата вам нужен.
Bпредставляет собой беззнаковый символ, 1 байт, диапазон значений: от 0 до 255Hпредставляет собой короткий беззнаковый 2 байта, диапазон значений: от 0 до 65535 Как видите,Bслишком мал для хранения значения года, поэтому вам нуженH.
Теперь вы знаете, что время состоит из 3 чисел, диапазон значений которых составляет от 0 до 60, таким образом, B это то, что вам нужно для всех из них, заканчивая форматом !HBBBBB.
Я немного подразобрался и отвечу сам. Для начала рассмотрим определение временной метки: unix timestamp - это количество СЕКУНД прошедших с 00:00:00 UTC on 1 January 1970(Unix epoch). В моем же случае временная метка указана в наносекундах, еще есть в микросекундах и т.д.
Для преобразования из timestamp в дату можно использовать методы datetime.utcfromtimestamp и datetime.fromtimestamp. Если же временная метка представлена в наносекундах, то придется писать свою функцию, например вот эту.
В представленном ответе от Violet рассматривается преобразование из типа datetime.