Преобразование времени эпохи Unix в время окон в Python - PullRequest
4 голосов
/ 29 декабря 2011

Быстрый вопрос: Есть ли питонный (в стандартных библиотеках или нет) способ преобразования 32-разрядной эпохи Unix в 64-битную эпоху Windows и обратно?

Ответы [ 2 ]

8 голосов
/ 29 декабря 2011

Вы можете преобразовать метку времени POSIX в datetime с помощью

>>> tstamp = 1325178061  # right about now
>>> from datetime import datetime
>>> datetime.fromtimestamp(tstamp)
datetime.datetime(2011, 12, 29, 18, 1, 1)

Именованный конструктор fromtimestamp принимает метки времени POSIX на всех платформах (!).

Преобразование в временную метку Windows было бы вопросом вычитания эпохи Windows, которую Википедия говорит , это 1 января 1601 года, и преобразованием полученного timedelta в число секунд:

>>> W_EPOCH = datetime(1601, 1, 1)
>>> (datetime.fromtimestamp(tstamp) - W_EPOCH).total_seconds()
12969655261.0

Теперь у вас есть float, который вы конвертируете в int и сохраняете как 64-битное количество любым удобным вам способом.

0 голосов
/ 21 июня 2019

Преобразовать метку времени Windows EPOCH в объект datetime (но не наоборот); вот решение, которое я придумал:

from datetime import datetime, timezone
def convert_from(windows_timestamp: int) -> datetime:
    unix_epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
    windows_epoch = datetime(1601, 1, 1, tzinfo=timezone.utc)
    epoch_delta = unix_epoch - windows_epoch
    windows_timestamp_in_seconds = windows_timestamp / 10_000_000
    unix_timestamp = windows_timestamp_in_seconds - epoch_delta.total_seconds()

    return datetime.utcfromtimestamp(unix_timestamp)

Это позволяет вам передавать отметку времени Windows как есть, и она будет выдавать действительный объект Python datetime .

ПРИМЕЧАНИЕ : Это специфично для Python 3.

...