Как вы представляете MS-DTYP `DATETIME` в Java 8 Instant? - PullRequest
0 голосов
/ 11 декабря 2019

В спецификации Microsoft DATETIME представляется как 2 32-разрядных целых числа: low и high

Ссылка: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/cca27429-5689-4a16-b2b4-9325d93e4ba2

Структура FILETIMEпредставляет собой 64-разрядное значение, представляющее число интервалов в 100 наносекунд, прошедших с 1 января 1601 года по всемирному координированному времени (UTC). typedef struct _FILETIME {DWORD dwLowDateTime;DWORD dwHighDateTime;} FILETIME, * PFILETIME, * LPFILETIME;dwLowDateTime: 32-разрядное целое число без знака, которое содержит младшие биты времени файла. dwHighDateTime: 32-разрядное целое число без знака, которое содержит старшие биты времени файла.

Например, вот длинное 130280867040000000

Так что старшее иlow вычисляется с помощью

int high = (int)(fullval >> 32);
int low = (int)fullval;

so high = 30333378 и low = 552794112

Как вычислить их для Java 8 Instant?

1 Ответ

1 голос
/ 11 декабря 2019

Ах, я лаял не на то дерево, когда разделял байты пополам.

По сути, это просто говорит, что единицы в 100 нс.

И у Эпохи тоже есть другое базовое время. Таким образом, вы должны также добавить смещение.

Так оно и есть:

    private static final long DATETIME_EPOCH_DIFF_1601;
    static {
        LocalDateTime time32Epoch1601 = LocalDateTime.of(1601, Month.JANUARY, 1, 0, 0);
        Instant instant = time32Epoch1601.atZone(ZoneOffset.UTC).toInstant();
        DATETIME_EPOCH_DIFF_1601 = (instant.toEpochMilli() - Instant.EPOCH.toEpochMilli()) / 1000;
    }
    Instant answer = Instant.ofEpochSecond(fullval / 10000000 + DATETIME_EPOCH_DIFF_1601)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...