java.time поддерживает юлианские дни.
Кредиты Игорю для проведения исследования и выяснения, как интерпретировать 12 байтов вашего массива.
byte[] int96Bytes = { 0, 44, 84, 119, 54, 49, 0, 0, -62, -127, 37, 0 };
// Find Julian day
int julianDay = 0;
int index = int96Bytes.length;
while (index > 8) {
index--;
julianDay <<= 8;
julianDay += int96Bytes[index] & 0xFF;
}
// Find nanos since midday (since Julian days start at midday)
long nanos = 0;
// Continue from the index we got to
while (index > 0) {
index--;
nanos <<= 8;
nanos += int96Bytes[index] & 0xFF;
}
LocalDateTime timestamp = LocalDate.MIN
.with(JulianFields.JULIAN_DAY, julianDay)
.atTime(LocalTime.NOON)
.plusNanos(nanos);
System.out.println("Timestamp: " + timestamp);
Это печатает:
Метка времени: 2017-10-24T03: 01: 50
Я не рад преобразовать ваш байтовый массив в int
и long
вручную,но я не знаю, Паркет будет достаточно, чтобы использовать преобразования, которые, вероятно, доступны там.Используйте их, если можете.
Неважно, какую LocalDate
мы используем в качестве отправной точки, так как мы все равно меняем ее на правильный юлианский день, поэтому я выбрал LocalDate.MIN
, чтобы выбрать одну.
Как я читаю документацию, юлианские дни всегда в местном часовом поясе, то есть часовой пояс не понимается, и они всегда начинаются в полдень (а не в полночь).
Ссылка: Документация JulianFields
в java.time