1. введение
В устаревших системах нам может потребоваться работать с датами, когда ни новый API даты и времени, ни настоятельно рекомендуемая библиотека времени Joda недоступны.
В этом коротком уроке мы рассмотрим несколько подходов, чтобы увидеть как получить текущую дату в системах до Java 8 .
2. Системное время
Когда все, что нам нужно, – это одно числовое значение, представляющее текущую дату и время, мы можем использовать системное время. Чтобы получить количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 GMT , мы можем использовать метод currentTimeMillis , который возвращает long :
long elapsedMilliseconds = System.currentTimeMillis();
Когда мы хотим измерить прошедшее время с большей точностью, мы можем использовать метод nanoTime . Это вернет значение наносекунд, прошедших с фиксированного, но произвольного момента.
Это произвольное время одинаково для всех вызовов внутри JVM, поэтому возвращаемое значение полезно только для вычисления разницы в прошедших наносекундах между несколькими вызовами nanoTime :
long elapsedNanosecondsStart = System.nanoTime(); long elapsedNanoseconds = System.nanoTime() - elapsedNanosecondsStart;
3. Пакет java.util
Используя классы из пакета java.util , мы можем представить момент времени, обычно в миллисекундах, прошедших с 1 января 1970 года 00:00:00 GMT .
3.1. java.util.Date
Мы можем представить конкретную дату и время с помощью объекта Date . Это содержит точность в миллисекундах и информацию о часовом поясе .
Хотя существует множество доступных конструкторов, самый простой способ создать объект Date , представляющий текущую дату в локальном часовом поясе, – это использовать базовый конструктор:
Date currentUtilDate = new Date();
Теперь давайте создадим объект Date для определенной даты и времени. Мы могли бы использовать вышеупомянутые конструкторы и просто передать значение миллисекунды.
В качестве альтернативы мы можем использовать класс SimpleDateFormat для преобразования строки значения в фактический Дата объект:
SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); Date customUtilDate = dateFormatter.parse("30-01-2020 10:11:12");
Мы можем использовать широкий спектр шаблонов данных в соответствии с вашими потребностями.
3.2. java.util.Календарь
Объект Calendar может делать то, что делает Date , и это лучше для арифметических вычислений даты, поскольку он также может принимать Locale . Мы можем указать Locale как географический, политический или культурный регион.
Чтобы получить текущую дату без указания часового пояса или Локали , мы можем использовать метод getInstance :
Calendar currentUtilCalendar = Calendar.getInstance();
А для преобразования Calendar to Date мы можем просто использовать метод getTime :
Date currentDate = Calendar.getInstance().getTime();
Забавно, что класс GregorianCalendar является реализацией наиболее часто используемого календаря в мире.
4. Пакет java.sql
Далее мы рассмотрим три расширения java.util.Класс Date , представляющий эквивалентные объекты SQL.
4.1. java.sql.Дата
С помощью объекта java.sql.Date у нас нет доступа к информации о часовом поясе, и точность усекается на уровне дня . Для представления сегодняшнего дня мы можем использовать конструктор, который занимает длинное представление миллисекунд:
Date currentSqlDate = new Date(System.currentTimeMillis());
Как и прежде, для определенной даты мы можем использовать класс SimpleDateFormat для преобразования в java.util.Сначала установите дату , а затем получите миллисекунды, используя метод getTime . Затем мы можем передать это значение в конструктор java.sql.Date .
Мы можем просто использовать метод valueOf , когда String представление Даты соответствует шаблону yyyy-[m]m-[d]d :
Date customSqlDate = Date.valueOf("2020-01-30");
4.2. java.sql.Time
Объект java.sql.Time предлагает доступ к информации о часах, минутах и секундах — опять же, без доступа к часовому поясу. Давайте получим текущее Время , используя представление в миллисекундах:
Time currentSqlTime = new Time(System.currentTimeMillis());
Чтобы указать время с помощью метода valueOf , мы можем передать значение, соответствующее шаблону hh:mm:ss :
Time customSqlTime = Time.valueOf("10:11:12");
4.3. java.sql.Метка времени
В этом последнем разделе мы объединим информацию SQL Date и Time , используя класс Timestamp . Это позволяет нам иметь точность до наносекунд .
Давайте создадим Метка времени объект, еще раз передав конструктору значение long для текущего количества миллисекунд:
Timestamp currentSqlTimestamp = new Timestamp(System.currentTimeMillis());
Наконец, давайте создадим новую пользовательскую метку Времени , используя значение метода с требуемым yyyy-[m]m-[d]d hh:mm:ss[.f…] шаблоном:
Timestamp customSqlTimestamp = Timestamp.valueOf("2020-1-30 10:11:12.123456789");
5. Заключение
В этом коротком уроке мы рассмотрели, как получить текущую дату и дату для данного момента без использования Java 8 или каких-либо внешних библиотек.
Как всегда, код статьи доступен на GitHub .