Достаточно ли длинна Java для хранения времени в микросекундах? - PullRequest
0 голосов
/ 01 февраля 2019

Могу ли я использовать java long для хранения с разумной точностью времени эпохи в микросекундах без каких-либо специальных приемов преобразования со знаком в без знака?Если да, то как рассчитать диапазон дат окончания?

Это обычный 8-байтовый диапазон дат: от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807

ОБНОВЛЕНИЕ

Спредложения по использованию:

new Date(Long.MAX_VALUE)

вот конечная дата для ум:

new Date(Long.MAX_VALUE/1_000)

Sat Jan 09 20:00:54 PST 294247

И это конечная дата с использованием положительных длинных значений для нано секунд:

new Date(Long.MAX_VALUE/1_000_000)

Fri Apr 11 16:47:16 PDT 2262

1 Ответ

0 голосов
/ 01 февраля 2019

тл; д-р

  • Нанос дает только 3 века.
  • Никогда не сверните свое собственное время. ☛ Использовать java.time
  • При обмене значениями даты и времени никогда не используйте счет из эпохи, используйте текст в стандарте ISO 8601 формат.

Выполнение математических операций

Вы должны выбрать справочную дату эпохи .В то время как десятки различных эпох используются в промышленности, одна из наиболее распространенных часто упоминается как Unix Time : первый момент 1970 года в UTC, 1970-01-01T00:00: 00Z.Моменты после этой точки отслеживаются с использованием положительного числа, а в предыдущие моменты - отрицательного числа.

Конечно, длина года зависит от високосного года, но мы можем легко приблизиться.Получите число наносекунд в год, используя класс TimeUnit с его удобными методами преобразования.

Сократите некоторые числа.

long nanosPerDay = TimeUnit.DAYS.toNanos( 1L );
long nanosPerYear = ( long ) ( nanosPerDay * 365.25 );
long maximumYears = ( Long.MAX_VALUE / nanosPerYear );

Дамп на консоль.

System.out.println( "nanosPerDay: " + nanosPerDay );
System.out.println( "nanosPerYear: " + nanosPerYear );
System.out.println( "Long.MAX_VALUE: " + Long.MAX_VALUE + " provides for maximumYears: " + maximumYears );

См. Этот код, запущенный на IdeOne.com .

nanosPerDay: 86400000000000

nanosPerYear: 31557600000000000

Long.MAX_VALUE: 9223372036854775807 обеспечивает максимальное количество лет: 292

меньше чем 10 5 * * 10513 века до и после 1970 года. Таким образом, этот подход работает, если несколько столетий достаточно для вашего приложения.По крайней мере, вас не будет рядом, чтобы починить, когда закончится календарь.; -)

Instant

К счастью, нам не нужно делать это самостоятельно.

Современная Java поставляется с самой продвинутой средой обработки даты и времени, доступной для бизнес-ориентированных приложений: java.time классы, определенные в JSR 310 .

Класс java.time.Instant использует другую стратегию для отслеживания времени.Этот класс хранит счет целых секунд до / после эпохи 1970 UTC, а также отдельный подсчет наносекунд за доли секунды.

Думайте об этом как:

moment = ( whole-seconds + fractional-second ) ; // Since 1970-01-01T00:00:00Z.

Это включает минимум / максимум:

Обратите внимание, что классы java.time имеют разрешениенаносекунд, в то время как устаревшие классы, которые они вытеснили (Date, Calendar и т. д.), разрешились до миллисекунд .

Подробные сведения см. в классе JavaDoc и исходный код OpenJDK Mercurial ).

Совет. Классы java.time наиболее подходят для бизнес-целей.Если вы занимаетесь научной, инженерной, археологической или исторической работой, используйте другие обозначения, подходящие для данной области, например, типа String.

Гранулярность

Имейте в виду, что разные компьютерные системы используют разные гранулярности при хранении своего времени.

Как отмечалось выше, классы java.time разрешаютдо наносекунд, для девяти цифр десятичной дробной секунды.Унаследованные классы использовали миллисекунды для трех цифр десятичной дробной секунды.Другие системы, такие как база данных Postgres , используют микросекунды для шести цифр десятичной дробной секунды.При обмене или сравнении данных по системам вы можете использовать методы truncatedTo в различных классах java.time .

Текущие обычные часы аппаратного обеспечения компьютера с точностью до микросекунд или грубее.Они могут сообщать о наносекундах, но не являются точными в этой степени.Итак, вы обнаружите, что метод Instant.now() в Java 9, 10 и 11 фиксирует текущий момент в микросекунду (в то время как тип данных может обрабатывать нанос, он обнаруживает current время в микро).

Instant.now (). ToString (): 2019-01-23T12: 34: 56.123456Z


О java.time

TОн 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?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...