Статьи

Получение текущей даты и времени в Java

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

Использование Даты и Календарных Классов

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

Вот код

. . .
public static void getCurrentTimeUsingDate() {
    Date date = new Date();
    String strDateFormat = "hh:mm:ss a";
    DateFormat dateFormat = new SimpleDateFormat(strDateFormat);
    String formattedDate= dateFormat.format(date);
    System.out.println("Current time of the day using Date - 12 hour format: " + formattedDate);
}
. . . .

В приведенном выше коде мы создали  Date объект и указали формат для времени. В строке формата нижний регистр  hh представляет 12-часовой формат while  mm и  ss представляет минуты в часах и секунды в минутах соответственно. Также  a в строке формата находится маркер am / pm. Затем мы создали  SimpleDateFormat объект, инициализированный строкой форматирования, и вызвали  format() метод, передающий  Date объект. format() Метод возвращает текущее время в формате мы указали.

Использование   класса Calendar одинаково просто. Вот код

. . .
public static void getCurrentTimeUsingCalendar() {
    Calendar cal = Calendar.getInstance();
    Date date=cal.getTime();
    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    String formattedDate=dateFormat.format(date);
    System.out.println("Current time of the day using Calendar - 24 hour format: "+ formattedDate);
}
. . .

В приведенном выше коде мы вызвали  getInstance() фабричный метод  Calendar класса для получения  Calendar объекта, а затем вызвали  getTime() метод для него. Этот метод возвращает  Date объект. Остальной код такой же, как я объяснил в предыдущем примере с датой. Единственное отличие, которое вы должны соблюдать, это строка формата. Здесь мы указали час как  HH (верхний регистр), что даст нам время в 24-часовом формате.

Вот полный код.

CurrentTimeDateCalendar

package guru.springframework.blog.currenttime;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class CurrentTimeDateCalendar {
    public static void getCurrentTimeUsingDate() {
        Date date = new Date();
        String strDateFormat = "hh:mm:ss a";
        DateFormat dateFormat = new SimpleDateFormat(strDateFormat);
        String formattedDate= dateFormat.format(date);
        System.out.println("Current time of the day using Date - 12 hour format: " + formattedDate);
    }
    public static void getCurrentTimeUsingCalendar() {
        Calendar cal = Calendar.getInstance();
        Date date=cal.getTime();
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        String formattedDate=dateFormat.format(date);
        System.out.println("Current time of the day using Calendar - 24 hour format: "+ formattedDate);
    }
}

Затем мы напишем тестовый класс.

CurrentTimeDateCalendarTest

package guru.springframework.blog.currenttime;

import org.junit.Test;

import static org.junit.Assert.*;


public class CurrentTimeDateCalendarTest {

    @Test
    public void testGetCurrentTimeUsingDate() throws Exception {
        CurrentTimeDateCalendar.getCurrentTimeUsingDate();

    }

    @Test
    public void testGetCurrentTimeUsingCalendar() throws Exception {
        CurrentTimeDateCalendar.getCurrentTimeUsingCalendar();
    }
}

Выход такой.

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running guru.springframework.blog.currenttime.CurrentTimeDateCalendarTest
Current time of the day using Date - 12 hour format: 11:13:01 PM
Current time of the day using Calendar - 24 hour format: 23:13:01
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec - in guru.springframework.blog.currenttime.CurrentTimeDateCalendarTest

В настоящее время вы можете подумать, что вычисление текущего времени в Java никогда не может быть проще. Но у   классов Date  и Calendar есть некоторые недостатки. Когда вы начинаете разрабатывать корпоративные приложения, недостатки становятся более очевидными. Прежде всего, оба класса не являются потокобезопасными, что может привести к проблемам параллелизма. Кроме того, оба класса имеют ограничение вычисления времени только до миллисекунд. В критически важных корпоративных приложениях часто требуется представлять время с точностью до наносекунды.
Кроме того, хотя  Дата Класс сам по себе не является устаревшим, из-за плохого дизайна API большинство его конструкторов и методов теперь устарели. Из-за таких проблем разработчики корпоративных приложений обратились к сторонним специализированным API даты и времени, особенно  Joda-Time .

Использование java.time

Команда Oracle по спецификации Java осознала ограничения встроенного API обработки даты и времени и для обеспечения более эффективного API представила   пакет java.time в новой Java SE 8. Этот проект был разработан совместно Oracle и Стивеном Коулборном, автор Joda-Time. Новый   API java.time « вдохновлен Joda-Time ».

Расчет времени часового пояса по умолчанию

В   пакете java.time есть несколько классов для работы с датой и временем. Давайте начнем с некоторого кода для расчета текущего времени часового пояса по умолчанию.

. . .
public static void getCurrentTime(){
     System.out.println("-----Current time of your time zone-----");
     LocalTime time = LocalTime.now();
     System.out.println("Current time of the day: " + time);
 }
. . .

Как вы можете заметить, код довольно прост. Мы вызвали  now() метод,  LocalTimeкоторый возвращает  LocalTime объект. Это неизменный объект, который представляет время без даты и часовой пояс в  календарной системе ISO-8601 .

Вывод кода есть.

-----Current time of your time zone-----
Current time of the day: 23:13:01.762

В приведенном выше выводе обратите внимание, что время представлено с точностью до наносекунды.

Расчет времени другого часового пояса

Пакет  java.time  предоставляет классы, которые вы можете использовать для получения текущего времени другого часового пояса. Например, если вы находитесь в часовом поясе по умолчанию и хотите, чтобы текущее время дня другого часового пояса, например,  America / Los_Angeles , вы можете использовать следующие классы:

  • ZoneId : представляет определенный часовой пояс.
  • DateTimeFormatter : Подобно   классу SimpleDateFormat, который мы обсуждали ранее, этот класс является средством форматирования для анализа и печати объектов даты и времени.

Код для вычисления текущего времени другого часового пояса — это.

. . .
public static void getCurrentTimeWithTimeZone(){
    System.out.println("-----Current time of a different time zone using LocalTime-----");
    ZoneId zoneId = ZoneId.of("America/Los_Angeles");
    LocalTime localTime=LocalTime.now(zoneId);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
    String formattedTime=localTime.format(formatter);
    System.out.println("Current time of the day in Los Angeles: " + formattedTime);

}
. . .

В строке 4 — строке 5 мы создали  ZoneId объект для представления  America/Los_Angeles часового пояса, а затем получили текущее время часового пояса, вызвав  now() метод, передающий  ZoneIdLocalTime Объект , что  now() возвращает метод имеет текущее время дня  America/Los_Angeles. Из строки 6 — строки 8 мы отформатировали время в 24-часовой формат, используя  DateTimeFormatter и распечатав отформатированное время.

Вывод кода есть.

-----Current time of a different time zone using LocalTime-----
Current time of the day in Los Angeles: 16:29:23

Расчет времени другого смещения времени

Смещение времени — это количество времени в часах и минутах, добавленное или вычтенное из  всемирного координированного времени (UTC) . Пакет  java.time  предоставляет   класс ZoneOffset для расчета текущего времени дня с другим смещением времени.

Код для использования   класса ZoneOffset это.

. . .
public static void getCurrentTimeWithOffset(){
    System.out.println("-----Current time of different offset-----");
    ZoneOffset zoneOffset = ZoneOffset.of("-08:00");
    ZoneId zoneId=ZoneId.ofOffset("UTC", zoneOffset);
    LocalTime offsetTime = LocalTime.now(zoneId);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
    String formattedTime=offsetTime.format(formatter);
    System.out.println("Current time of the day with offset -08:00: " + formattedTime);

}
. . .

В приведенном выше коде мы создали  ZoneOffset объект в строке 4 для представления временного смещения -8: 00. В строке 5 мы создали  ZoneId объект, инициализированный  ZoneOffset объектом. Оставшийся код от строки 6 до строки 9 использует  LocalTime объект, инициализированный с  ZoneId помощью  DateTimeFormatter объекта и, для форматирования времени в 12-часовом формате с помощью маркера am / pm.

Вывод предыдущего кода:

-----Current time of different offset-----
Current time of the day with offset -08:00: 03:29 PM

Полный код фрагментов, которые мы обсуждали, таков.

package guru.springframework.blog.currenttime;

import java.time.*;
import java.time.format.DateTimeFormatter;
public class CurrentTimeJava8 {
   public static void getCurrentTime(){
        System.out.println("-----Current time of your time zone-----");
        LocalTime time = LocalTime.now();
        System.out.println("Current time of the day: " + time);
    }
    public static void getCurrentTimeWithTimeZone(){
        System.out.println("-----Current time of a different time zone using LocalTime-----");
        ZoneId zoneId = ZoneId.of("America/Los_Angeles");
        LocalTime localTime=LocalTime.now(zoneId);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        String formattedTime=localTime.format(formatter);
        System.out.println("Current time of the day in Los Angeles: " + formattedTime);

    }
    public static void getCurrentTimeWithOffset(){
        System.out.println("-----Current time of different offset-----");
        ZoneOffset zoneOffset = ZoneOffset.of("-08:00");
        ZoneId zoneId=ZoneId.ofOffset("UTC", zoneOffset);
        LocalTime offsetTime = LocalTime.now(zoneId);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
        String formattedTime=offsetTime.format(formatter);
        System.out.println("Current time of the day with offset -08:00: " + formattedTime);

    }
}

Давайте напишем тестовый класс, чтобы увидеть код в действии.

package guru.springframework.blog.currenttime;

import org.junit.Test;

import static org.junit.Assert.*;

public class CurrentTimeJava8Test {
    @Test
    public void testGetCurrentTime() throws Exception {
        CurrentTimeJava8.getCurrentTime();
    }
    @Test
    public void testGetCurrentTimeWithTimeZone() throws Exception {
        CurrentTimeJava8.getCurrentTimeWithTimeZone();
         }
    @Test
    public void testGetCurrentTimeWithOffset() throws Exception {
        CurrentTimeJava8.getCurrentTimeWithOffset();
    }
}

Вывод, полученный при запуске теста с использованием Maven, показан ниже, который, очевидно, будет отличаться в зависимости от вашего текущего времени и часового пояса.

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running guru.springframework.blog.currenttime.CurrentTimeJava8Test
-----Current time of your time zone-----
Current time of the day: 06:59:52.803
-----Current time of a different time zone using LocalTime-----
Current time of the day in Los Angeles: 18:29:52
-----Current time of different offset-----
Current time of the day with offset -08:00: 05:29 PM
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.337 sec - in guru.springframework.blog.currenttime.CurrentTimeJava8Test

Резюме

С точки зрения работы со временем в Java, этот пост только поцарапал поверхность. Пакет  java.time  имеет обширный набор классов, который упрощает работу с датой и временем. Однако вы также столкнетесь с   классами Date  и  Calendar и Joda-Time API при работе с устаревшими приложениями. Но благодаря мощным функциям, встроенным в  java.time , вы можете легко преобразовать свой устаревший код для вычисления даты и времени в  java.time . Продолжайте изучать   API java.time , который очень хорошо документирован и прост в использовании.

Помните, что когда вы используете параметры местного времени, Java проходит через JVM, чтобы общаться с любым компьютером, на котором работает. Вот как Java определяет время и локаль операций времени. Таким образом, ваш код может давать разные результаты при работе на разных машинах. В качестве предостережения, когда вы работаете с небольшими приложениями, часто вам не нужно беспокоиться о часовом поясе. Но в больших приложениях вы будете. Вам нужно, чтобы ваш код знал о часовом поясе. Многие разработчики игнорируют компонент часового пояса, а затем сталкиваются с проблемами по мере роста их приложения.