«1. Введение

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

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

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

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

long elapsedMilliseconds = System.currentTimeMillis();

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

Это произвольное время одинаково для всех вызовов внутри 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, представляющий текущую дату в местном часовом поясе, — это использовать базовый конструктор:

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

Date currentUtilDate = new 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

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

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

А для преобразования календаря в дату мы можем просто использовать метод getTime:

Calendar currentUtilCalendar = Calendar.getInstance();

Забавно, что класс GregorianCalendar — это реализация самого используемого календаря в мире.

Date currentDate = Calendar.getInstance().getTime();

4. Пакет java.sql

Далее мы рассмотрим три расширения класса java.util.Date, которые представляют эквивалентные объекты SQL.

4.1. java.sql.Date

С объектом java.sql.Date у нас нет доступа к информации о часовом поясе, а точность усекается на уровне дня. Чтобы представить сегодняшний день, мы можем использовать конструктор, который принимает длинное представление миллисекунд:

Как и прежде, для конкретной даты мы можем использовать класс SimpleDateFormat для преобразования сначала в java.util.Date, а затем получить миллисекунды с помощью метода getTime. Затем мы можем передать это значение конструктору java.sql.Date.

Date currentSqlDate = new Date(System.currentTimeMillis());

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

4.2. java.sql.Time

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

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

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

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

4.3. java.sql.Timestamp

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

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

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

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

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

5. Заключение

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

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

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

«