Преобразование микросекунд в миллисекунды без потери точности и форматирование в виде даты и времени в Java - PullRequest
0 голосов
/ 05 ноября 2018

Как преобразовать входящее значение длительного времени в microseconds в milliseconds, а затем отформатировать его в метку времени данных, как показано ниже:

YYyyMmDd-HH: мм: СС.ссс

Я использую Java SimpleDateFormat для форматирования длинного значения с отметкой времени. Но преобразование микросекунд в миллисекунды кажется проблемой, так как я теряю значение.

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS");

Чтобы преобразовать микросекунды в миллисекунды, я использую TimeUnit:

long micro //microseconds
long milli = TimeUnit.MILLISECONDS.convert(micro, TimeUnit.MICROSECONDS);

Как правильно преобразовать значение без потери данных?

1 Ответ

0 голосов
/ 05 ноября 2018

Я использую Java SimpleDateFormat

Не.

Избегайте коварных старых классов даты и времени, связанных с самыми ранними версиями Java. Они были вытеснены несколько лет назад классами java.time , когда был принят JSR 310.

преобразовать входящее длительное значение в микросекунды в миллисекунды

Не.

Классы java.time используют разрешение наносекунд , что меньше, чем ваши микросекунды. Поэтому не нужно выбрасывать данные.

Instant = (целые секунды + дробная секунда в виде нано)

Извлечь количество целых секунд.

long seconds = TimeUnit.MICROSECONDS.toSeconds( micros ) ;

Получите долю секунды, количество микросхем, оставшихся после вычитания на целые секунды.

long microsRemaining = 
    micros 
    -
    TimeUnit.SECONDS.toMicros( seconds ) 
;

Преобразуйте оставшиеся микро в нано, потому что класс Instant, который мы используем далее, представляет количество целых секунд плюс количество наносекунд (за долю секунды).

long nanos = TimeUnit.MICROSECONDS.toNanos( microsRemaining ) ;

Объедините целые секунды с долей секунды в нанослоях. Класс Instant представляет момент в UTC в виде числа отсчетов с начала отсчета первого момента 1970 года в UTC, 1970-01-01T00: 00Z.

Instant instant = Instant.ofEpochSecond( seconds ).plusNanos( nanos ) ;

Чтобы сгенерировать строку в стандартном формате ISO 8601, просто наберите toString.

String output = instant.toString() ;

Z в конце строки означает UTC (смещение от UTC, равное нулю часов-минут-секунд) и произносится как Zulu.

Вы можете создавать строки в собственных форматах, используя класс DateTimeFormatter. Переполнение стека поиска , поскольку это уже было рассмотрено много-много раз.

Подсказка: Ваш желаемый формат настолько близок к формату ISO 8601, ГГГГ-ММ-ДДЧЧ: ММ: ССЗ, что Я настоятельно рекомендую использовать стандартный формат , а не создавать своего двоюродного брата из этого .

Если вы хотите увидеть этот же момент через объектив настенного времени, используемого людьми определенного региона (часового пояса), примените ZoneId, чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of( "Africa/Tunisia" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

...