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