Ваш вопрос не соответствует двум различным типам ввода. Сначала мы рассмотрим целые секунды, затем посмотрим на ввод с десятичной дробью.
Целые Секунды
Нет необходимости для умножения на тысячу, когда вход отсчет секунд с epoch reference date. Класс Instant
предлагает статический метод ofEpochSecond
для обработки целых секунд.
OffsetDateTime
При работе с только offset-from-UTC (или сам UTC), используйте OffsetDateTime
класс. Класс ZonedDateTime
предназначен для назначения полного часового пояса. Полный часовой пояс - offset-from-UTCплюс набор правил для обработки аномалий, таких как Daylight Saving Time (DST).
Итак, в чем разница между Instant
и OffsetDateTime
присвоенными UTC как смещение? Нет разницы в значении, оба представляют один и тот же момент. Но у OffsetDateTime
есть дополнительные возможности. Одной из таких функций является гибкое форматирование при создании представления String, тогда как Instant
не предназначено для форматирования, отличного от собственного метода toString
.
String input = "480364794";
Instant instant = Instant.ofEpochSecond (Long.parseLong (input));
OffsetDateTime odt = OffsetDateTime.ofInstant (instant , ZoneOffset.UTC);
System.out.println ("input: " + input + " | instant: " + instant + " | odt: " + odt);
При запуске.
вход: 480364794 | мгновенный: 1985-03-22T18: 39: 54Z | ODT: 1985-03-22T18: 39: 54Z
Фракционных Второй
Для ввода дробной секунды, отделить целое число секунд из фракции. Затем передайте каждый статический заводский метод, Instant.ofEpochSecond
, используя два аргумента.
Один из способов получения этих номеров - BigDecimal
. Мы не используем double
/float
, потому что эти типы данных торгуют точностью для скорости выполнения.
См. this Question для обсуждения извлечения фракционной части BigDecimal
. Особенно примечательны this Answer и this Answer.
BigDecimal input = new BigDecimal ("444663422.631236");
// Seconds
long seconds = input.longValue(); // = 444,663,422. Truncates the fraction. Only the whole number portion remains.
// Nanoseconds
BigDecimal fractionalSecond = input.remainder (BigDecimal.ONE); // = 0.631236. Truncates whole number. Only decimal fraction remains.
int decimalPlacesForNanoseconds = 9;
if (fractionalSecond.scale() > decimalPlacesForNanoseconds) { // Too many decimal places?
// FIXME: Handle this error condition. This means data loss as our input has a granularity finer than nanoseconds.
System.out.println ("ERROR - Input finer than nanoseconds. Message # 0aa71e3b-6a5b-4ac4-b239-68e6b9f12284.");
}
BigInteger nanosBI = fractionalSecond.movePointRight (decimalPlacesForNanoseconds).toBigInteger(); // Make a whole number from the fraction.
long nanos = nanosBI.longValue();
// Instant = (Seconds + Nanoseconds)
Instant instant = Instant.ofEpochSecond (seconds , nanos);
Дамп для консоли.
System.out.println ("input: " + input + " | seconds: " + seconds + " | nanos: " + nanos + " | instant: " + instant);
При работе.
вход: 444663422.631236 | секунд: 444663422 | Нано: 631236000 | момент: 1984-02-03T13: 37: 02.631236Z
'конвертировать', кажется, все в порядке, и какую банку вы использовали в' convertEpoc'? – Blank
@ JoséHolandaNeto Что значит «не работает»? Что вы ожидали и что вы получили вместо этого? –
@ JoséHolandaNeto Почему вы приводите один пример ввода в первом предложении, но затем даете совершенно разные входы в вашем примере кода? Пожалуйста, помогите организовать свои мысли перед публикацией. –