Как программисту на 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()
метод, передающий ZoneId
. LocalTime
Объект , что 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 определяет время и локаль операций времени. Таким образом, ваш код может давать разные результаты при работе на разных машинах. В качестве предостережения, когда вы работаете с небольшими приложениями, часто вам не нужно беспокоиться о часовом поясе. Но в больших приложениях вы будете. Вам нужно, чтобы ваш код знал о часовом поясе. Многие разработчики игнорируют компонент часового пояса, а затем сталкиваются с проблемами по мере роста их приложения.