Перейти к основному содержимому

Получить текущую дату до Java 8

· 4 мин. чтения

1. Введение

В устаревших системах нам может понадобиться работать с датами, когда нет ни нового API даты и времени, ни настоятельно рекомендуемой библиотеки Joda-Time .

В этом кратком руководстве мы рассмотрим несколько подходов к получению текущей даты в системах до Java 8 .

2. Системное время

Когда все, что нам нужно, — это одно числовое значение, представляющее текущую дату и время, мы можем использовать системное время. Чтобы получить количество миллисекунд, прошедших с 00:00:00 по Гринвичу 1 января 1970 года, мы можем использовать метод currentTimeMillis , который возвращает тип long :

long elapsedMilliseconds = System.currentTimeMillis();

Когда мы хотим измерить прошедшее время с большей точностью, мы можем использовать метод nanoTime . Это вернет значение наносекунд, прошедших с фиксированного, но произвольного момента.

Это произвольное время одинаково для всех вызовов внутри JVM, поэтому возвращаемое значение полезно только для вычисления разницы в прошедших наносекундах между несколькими вызовами nanoTime :

long elapsedNanosecondsStart = System.nanoTime();
long elapsedNanoseconds = System.nanoTime() - elapsedNanosecondsStart;

3. Пакет java.util

Используя классы из пакета java.util , мы можем представить момент времени, обычно миллисекундами, прошедшими с 00:00:00 по Гринвичу 1 января 1970 года .

3.1. java.util.Дата

Мы можем представить конкретную дату и время, используя объект Date . Он содержит точность в миллисекундах и информацию о часовом поясе .

Хотя доступно множество конструкторов, самый простой способ создать объект Date , представляющий текущую дату в местном часовом поясе, — использовать базовый конструктор:

Date currentUtilDate = new Date();

Давайте теперь создадим объект Date для определенной даты и времени. Мы могли бы использовать вышеупомянутые конструкторы и просто передать значение миллисекунд.

В качестве альтернативы мы можем использовать класс SimpleDateFormat для преобразования значения String в фактический объект Date :

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 как географический, политический или культурный регион.

Чтобы получить текущую дату без указания TimeZone или Locale , мы можем использовать метод getInstance :

Calendar currentUtilCalendar = Calendar.getInstance();

А для преобразования календаря в дату мы можем просто использовать метод 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.Date , а затем получить миллисекунды с помощью метода getTime . Затем мы можем передать это значение конструктору java.sql.Date .

Мы можем просто использовать метод valueOf , когда строковое представление Date соответствует шаблону yyyy-[m]m-[d]d :

Date customSqlDate = Date.valueOf("2020-01-30");

4.2. java.sql.Время

Объект java.sql.Time предлагает доступ к информации о часах, минутах и секундах — опять же, без доступа к часовому поясу. Давайте получим текущее время , используя представление миллисекунд:

Time currentSqlTime = new Time(System.currentTimeMillis());

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

Time customSqlTime = Time.valueOf("10:11:12");

4.3. java.sql.Timestamp

В этом последнем разделе мы объединим информацию о дате и времени SQL, используя класс Timestamp . Это позволяет нам иметь точность до наносекунд .

Давайте создадим объект Timestamp , еще раз передав длинное значение для текущего количества миллисекунд в конструктор:

Timestamp currentSqlTimestamp = new Timestamp(System.currentTimeMillis());

Наконец, давайте создадим новую пользовательскую метку времени , используя метод valueOf с требуемым шаблоном yyyy-[m]m-[d]d hh:mm:ss[.f…] :

Timestamp customSqlTimestamp = Timestamp.valueOf("2020-1-30 10:11:12.123456789");

5. Вывод

В этом кратком руководстве мы увидели, как получить текущую дату и дату для данного момента без использования Java 8 или каких-либо внешних библиотек.

Как всегда, код статьи доступен на GitHub .