Перетворення часу на мілісекунди на Java
У цьому короткому посібнику ми проілюструємо кілька способів перетворення часу на мілісекунди епохи Unix в Java .
Зокрема, ми використовуватимемо:
- java.util.Date та календар Core Java ``
- API дати та часу Java 8
- Бібліотека Joda-Time
2. Ядро Java
2.1. Використання дати
По-перше, давайте визначимо властивість millis, що містить випадкове значення в мілісекундах:
long
millis
=
1556175797428L;
// April 25, 2019 7:03:17.428 UTC
Ми будемо використовувати це значення для ініціалізації різних об'єктів і перевірки наших результатів.
Далі почнемо з об'єкта Date:
Date
date
=
// implementation details
Тепер ми готові перетворити дату на мілісекунди, просто викликавши метод getTime() :
Assert.assertEquals(millis,
date.getTime());
2.2. Використання календаря
Аналогічно, якщо у нас є об'єкт Calendar, ми можемо використовувати метод getTimeInMillis():
Calendar
calendar
=
// implementation details
Assert.assertEquals(millis,
calendar.getTimeInMillis());
3. API дати та часу Java 8
3.1. Використання миттєвого
Простіше кажучи, Instant це точка на тимчасовій шкалі епохи Java.
Ми можемо отримати поточний час у мілісекундах з Instant :
java.time.Instant
instant
=
// implementation details
Assert.assertEquals(millis,
instant.toEpochMilli());
В результаті метод toEpochMilli() повертає ту саму кількість мілісекунд, яку ми визначили раніше.
3.2. Використання локальної дати та часу
Так само ми можемо використовувати API дати і часу Java 8 для перетворення LocalDateTime в мілісекунди:
LocalDateTime
localDateTime
=
// implementation details
ZonedDateTime
zdt
=
ZonedDateTime.of(localDateTime,
ZoneId.systemDefault());
Assert.assertEquals(millis,
zdt.toInstant().toEpochMilli());
По-перше, ми створили екземпляр поточної дати. Після цього ми використовували метод toEpochMilli() для перетворення ZonedDateTime в мілісекунди.
Як ми знаємо, LocalDateTime не містить інформації про часовий пояс. Іншими словами, ми не можемо отримати мілісекунди безпосередньо з екземпляра LocalDateTime .
4. Джода-Час
Хоча Java 8 додає більшу частину функціональності Joda-Time, ми можемо захотіти використовувати цю опцію, якщо ми використовуємо Java 7 або ранню версію.
4.1. Використання миттєвого
По-перше, ми можемо отримати поточні системні мілісекунди з екземпляра класу Joda-Time Instant , використовуючи метод getMillis() :
Instant
jodaInstant
=
// implementation details
Assert.assertEquals(millis,
jodaInstant.getMillis());
4.2. Використання дати та часу
Крім того, якщо у нас є екземпляр Joda-Time DateTime :
DateTime
jodaDateTime
=
// implementation details
Потім ми можемо отримати мілісекунди за допомогою методу getMillis() :
Assert.assertEquals(millis,
jodaDateTime.getMillis());
5. Висновок
На закінчення у цій статті показано, як перетворити час на мілісекунди на Java.
Нарешті, як завжди, повний код для цієї статті доступний GitHub .
Як виміряти час виконання
Найчастіше потрібно дізнатися, скільки часу виконується той чи інший код. Іноді потрібно заміряти час виконання методу чи завдання. У цій статті ми розповімо вам принципи вимірювання часу в Java і покажемо найкращі практики для конкретних завдань.
Вимірювання часу за допомогою currentTimeMills()
Це досить простий спосіб виміряти час. Метод System.currentTimeMillis() поверне вам поточний час у мілісекундах. Його потрібно викликати до виконання потрібного завдання і після, а потім обчислити різницю. У результаті ми дізнаємося час виконання у мілісекундах:
long start = System.currentTimeMillis(); // Виконання якоїсь логіки Thread.sleep (1000); long finish = System.currentTimeMillis(); long elapsed = finish - start; System.out.println("Минуло часу, мс: " + elapsed);
При роботі з даним методом слід враховувати його специфіку: System.currentTimeMillis() показує поточний час, ґрунтуючись на системному годиннику і може видавати некоректний результат.
Вимірювання часу за допомогою nanoTime()
Ще один метод отримання поточного часу це System.nanoTime(). Як випливає із назви, цей метод повертає час з точністю до нансекунд. Також робота цього методу не залежить від системного годинника.
Він використовується аналогічно:
long start = System.nanoTime(); // Виконання якоїсь логіки Thread.sleep (1000); long finish = System.nanoTime(); long elapsed = finish - start; System.out.println("Минуло часу, нс: " + elapsed);
Для отримання значення в мілісекундах результат можна поділити на 1000:
System.out.println("Минуло часу, мс: " + elapsed / 1000000);
Важливо: Хоча метод nanoTime() може повертати час у наносекундах, він не гарантує, що значення між його викликами оновлюватимуться з точністю до наносекунд.
Але все ж таки це більш прийнятний варіант, ніж System.currentTimeMillis().
Вимірювання часу за допомогою Instant і Duration
Java 8 додали новий java.time API. Зокрема, для вимірювання часу підійдуть два нових класи – Instant та Duration. Обидва ці класи іммутабельні.
Instant позначає час з початку епохи Unix (1970-01-01T00:00:00Z). Для створення моменту ми використовуємо метод Instant.now(). Після того, як ми створили два моменти, обчислимо різницю в мілісекундах:
Instant start = Instant.now(); // Виконання якоїсь логіки Thread.sleep (1000); Instant finish = Instant.now(); long elapsed = Duration.between(start, finish).toMillis(); System.out.println("Минуло часу, мс: " + elapsed);
Рекомендується використовувати саме цей підхід у Java 8 та вище.
Вимірювання часу виконання за допомогою StopWatch
StopWatch – це клас із бібліотеки Apache Commons Lang. Він працює як секундомір. Для його використання спочатку потрібно підключити бібліотеку до проекту:
org.apache.commons
commons-lang3
3.9
Тепер створимо екземпляр StopWatch. Потім почнемо відлік за допомогою методу start() і закінчимо відлік за допомогою методу stop():
public static void stopWatch() throws InterruptedException < StopWatch stopWatch = new StopWatch(); stopWatch.start(); // Виконання якоїсь логіки Thread.sleep (1000); stopWatch.stop(); System.out.println("Минуло часу, мс: " + stopWatch.getTime()); >
StopWatch зручно використовувати тоді, коли у проекті вже підключено цю бібліотеку.
Вихідний код
package uk.javalessons.time; import org.apache.commons.lang3.time.StopWatch; import java.time.Duration; import java.time.Instant; public class MeasureElapsedTime < public static void main(String[] args) throws InterruptedException < currentTimeMillis(); nanoTime(); instant(); stopWatch(); >public static void currentTimeMillis() throws InterruptedException < long start = System.currentTimeMillis(); // Виконання якоїсь логіки Thread.sleep (1000); long finish = System.currentTimeMillis(); long elapsed = finish - start; System.out.println("Минуло часу, мс: " + elapsed); >public static void nanoTime() throws InterruptedException < long start = System.nanoTime(); // Виконання якоїсь логіки Thread.sleep (1000); long finish = System.nanoTime(); long elapsed = finish - start; System.out.println("Минуло часу, нс: " + elapsed); >public static void instant() throws InterruptedException < Instant start = Instant.now(); // Виконання якоїсь логіки Thread.sleep (1000); Instant finish = Instant.now(); long elapsed = Duration.between(start, finish).toMillis(); System.out.println("Минуло часу, мс: " + elapsed); >public static void stopWatch() throws InterruptedException < StopWatch stopWatch = new StopWatch(); stopWatch.start(); // Виконання якоїсь логіки Thread.sleep (1000); stopWatch.stop(); System.out.println("Минуло часу, мс: " + stopWatch.getTime()); >>
Висновок
У цій статті ми розібрали прості методи вимірювання часу виконання Java.Для простих вимірів можна використовувати всі перераховані вище методи, крім поточногочасуміліси (через те, що він залежить від системного годинника).