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 .