Java8 новая библиотека времени и даты DateTime API и пример

Java

Функции новых функций Java 8 были значительно обновлены.Сегодня я сосредоточусь на обработке, связанной с DateTime, в библиотеке времени и даты. Точно так же, если вы все еще используете API-интерфейсы, такие как традиционные Date, Calendar и SimpleDateFormat, для обработки операций, связанных с датами в вашем проекте, вы не должны пропустить эту статью. Приходите освежить свою базу знаний!

задний план

Обработка дат, календарей и времени в Java уже давно подвергается критике, например, классы java.util.Date и java.util.Calendar не просты в использовании, не поддерживают часовые пояса и не являются потокобезопасными. ; есть еще класс DateFormat для форматирования дат, он тоже не потокобезопасен и так далее.

Новая серия API-интерфейсов, представленная Java8, обеспечивает лучшую поддержку обработки времени и даты и четко определяет некоторые концепции времени и даты, такие как мгновенное время (Instant), длительность (duration), дата (date), время (time ), часовой пояс (time-zone) и период времени (Period).

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

Введение

Ядро нового API времени и даты находится в java.time, и есть связанные API в java.time.chrono, java.time.format, java.time.temporal и java.time.zone, но они используются менее часто.

Обычно используемые классы даты и времени Java8 включают LocalDate, LocalTime, Instant, Duration, Period, LocalDateTime и ZonedDateTime.

  • LocalDate: дата без времени, например 2019-10-14. Может использоваться для хранения дней рождения, юбилеев, дат входа и т. д.
  • LocalTime: в отличие от LocalDate, это время, которое не содержит даты.
  • LocalDateTime: содержит дату и время без информации о смещении (часовой пояс).
  • ZonedDateTime: полная дата-время, включая часовой пояс, смещение основано на UTC/среднем времени по Гринвичу.
  • Instant: отметка времени, аналогичная System.currentTimeMillis().
  • Продолжительность: указывает период времени.
  • Период: используется для обозначения периода времени, измеряемого годом, месяцем и днем.

Кроме того, имеется новый класс для синтаксического анализа и форматирования даты DateTimeFormatter.

Лучший способ научиться — это практиковать, и теперь мы объясним каждый пункт знаний в виде примеров.

LocalDate - как получить дату

Класс LocalDate содержит только даты, а не конкретное время. Вы можете использовать его, только если вам нужно представить дату без времени.

// 只获取日期
LocalDate today = LocalDate.now();
System.out.println(today);

int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();

System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);

В то же время вы также можете получить день месяца, день недели, количество дней в месяце и является ли это високосным годом через LocalDate. Посмотрите, очень ли удобен приведенный ниже код.

LocalDate today = LocalDate.now();
// 月份中的第几天
int dayOfMonth = today.getDayOfMonth();
// 一周的第几天
DayOfWeek dayOfWeek = today.getDayOfWeek();
// 月份的天数
int length = today.lengthOfMonth();
// 是否为闰年
boolean leapYear = today.isLeapYear();

Объект LocalDate получен выше, или любая дата может быть создана с помощью статического метода() или синтаксического анализа. Уже не так, как раньше, год может начинаться только с 1900, месяц должен начинаться с 0 и т. д.

LocalDate oneDay = LocalDate.of(2019,10,1);
System.out.println(oneDay);

LocalDate parseDay = LocalDate.parse("2019-10-01");
System.out.println(parseDay);

Результат печати: 01.10.2019.

LocalDate переопределяет метод equals, чтобы упростить сравнение дат.

// 定义任意日期
LocalDate oneDay = LocalDate.of(2019, 10, 1);
System.out.println(oneDay);

// 定义任意比较
LocalDate anyDay = LocalDate.of(2019, 10, 1);
System.out.println(oneDay.equals(anyDay));

В то же время класс MonthDay или YearMonth также может быть расширен для даты, как следует из названия, содержит только день месяца или год месяц. То же самое относится и к методу equals для сравнения.

Кроме того, используйте before и after, чтобы сравнить время до и после двух дат.

boolean notBefore = LocalDate.parse("2019-10-01").isBefore(LocalDate.parse("2019-10-02"));
boolean isAfter = LocalDate.parse("2019-10-01").isAfter(LocalDate.parse("2019-10-02"));

Также очень удобно прибавлять или вычитать день после предыдущего дня или предыдущего месяца к дате.

LocalDate tomorrowDay = LocalDate.now().plusDays(1);
LocalDate nextMonth =  LocalDate.now().plusMonths(1);

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

LocalDate.now().atStartOfDay();
LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());

LocalTime - как узнать время

LocalTime похож на LocalDate, разница в том, что LocalDate не содержит определенного времени, а LocalTime содержит определенное время. Объекты также можно получить с помощью методов «сейчас» или «из».

LocalTime localTime = LocalTime.now();

LocalTime oneTime = LocalTime.of(10,10,10);

Подобно LocalDate, у него также есть такие методы, как parse, isBefore и получение единиц времени, поэтому я не буду их повторять.

Следует отметить, что формат времени, полученный LocalTime: 11:41:58.904. То есть ЧЧ:мм:сс.ннн, где ннн — наносекунды.

Существует также константа «23:59:59,99», которую мы часто определяем при запросе диапазона дат в реальном бою, и нам больше не нужно определять ее самостоятельно.

// 23:59:59.999999999
LocalTime maxTime = LocalTime.MAX;
// 00:00
LocalTime minTime = LocalTime.MIN;

LocalDateTime - комбинация даты и времени

LocalDateTime представляет комбинацию даты и времени. Его можно создать непосредственно с помощью метода of(), или вы можете вызвать метод atTime() LocalDate или метод atDate() LocalTime, чтобы объединить LocalDate или LocalTime в LocalDateTime.

Пример времени создания:

LocalDateTime now = LocalDateTime.now();

LocalDateTime oneTime = LocalDateTime.of(2019,10,14,10,12,12);

// 拼接日期
LocalTime.now().atDate(LocalDate.now());

LocalDateTime можно преобразовать друг в друга между LocalDate и LocalTime. Такие операции, как добавление и вычитание других дат, аналогичны описанным выше.

Мгновенно - получить временную метку

Instant используется для метки времени, аналогично System.currentTimeMillis(), но Instant может быть точным до наносекунд (наносекунд).

Помимо использования метода now() для создания Instant, его также можно создать с помощью метода ofEpochSecond.

Instant now = Instant.now();

Instant.ofEpochSecond(365 * 24 * 60, 100);

Первый параметр ofEpochSecond представляет секунды, а второй параметр представляет наносекунды. Общее представление: момент времени 100 наносекунд через 365 дней после начала 1970-01-01 00:00:00.

Продолжительность - получить период времени

Внутренняя реализация Duration аналогична Instant, но Duration представляет период времени, который создается методом between.

LocalDateTime from = LocalDateTime.now();
LocalDateTime to = LocalDateTime.now().plusDays(1);
Duration duration = Duration.between(from, to);

// 区间统计换算
// 总天数
long days = duration.toDays();
// 小时数
long hours = duration.toHours();
// 分钟数
long minutes = duration.toMinutes();
// 秒数
long seconds = duration.getSeconds();
// 毫秒数
long milliSeconds = duration.toMillis();
// 纳秒数
long nanoSeconds = duration.toNanos();

Объекты Duration также можно создавать с помощью метода of(), который принимает в качестве параметров продолжительность периода времени и единицу измерения времени.

// 7天
Duration duration1 = Duration.of(7, ChronoUnit.DAYS);
// 60秒
Duration duration2 = Duration.of(60, ChronoUnit.SECONDS);

Период - получить период даты

Period аналогичен Duration.Он получает период времени, но единицей измерения являются год, месяц и день.Он также может быть создан методом of и методом between.Параметр, получаемый методом between, — LocalDate.

Period period = Period.of(1, 10, 25);

Period period1 = Period.between(LocalDate.now(), LocalDate.now().plusYears(1));

ZonedDateTime - создать время часового пояса

Класс ZonedDateTime используется для обработки даты и времени с часовыми поясами. ZoneId представляет другой часовой пояс. Существует около 40 различных часовых поясов.

Получить коллекцию всех часовых поясов:

Set allZoneIds = ZoneId.getAvailableZoneIds();

Создайте часовой пояс:

ZoneId zoneId = ZoneId.of("Asia/Shanghai");

Преобразование LocalDateTime в определенный часовой пояс:

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), zoneId);

Другой класс, который работает с часовыми поясами, — это класс OffsetDateTime. OffsetDateTime является неизменяемым, представляет смещение даты и времени, хранит все поля даты и времени с точностью до наносекунд и вычисляет смещение относительно UTC/Greenwich.

формат даты времени

Операция форматирования дат в Java 8 очень проста.Во-первых, большинство вышеперечисленных классов предоставляют метод parse, который может напрямую получить соответствующий объект, анализируя строку.

Формат даты и времени может быть отформатирован методом форматирования LocalDateTime.

LocalDateTime dateTime = LocalDateTime.now();
String str = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(str);
str = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(str);

Вы можете использовать формат, предустановленный DateTimeFormatter, или указать формат с помощью метода DateTimeFormatter.ofPattern.

Обзор ключевых моментов

API для времени и даты в Java 8 имеет следующие ключевые моменты:

  • javax.time.ZoneId предоставляется для обработки часовых поясов.
  • Предоставляет классы LocalDate и LocalTime.
  • Все классы API времени и даты являются потокобезопасными.
  • Основные понятия времени и даты четко определены.
  • Основной API: Instant, LocalDate, LocalTime, LocalDateTime, ZonedDateTime.
  • Класс DateTimeFormatter используется для форматирования и анализа дат в Java.

Ну а функции времени и даты новых фич Java8 будут здесь.Намного ли это проще и быстрее в использовании?Давайте попрактикуемся в проекте.

Оригинальная ссылка: "Java8 новая библиотека времени и даты DateTime API и пример


Программа Новые Горизонты: Захватывающие и растущие нельзя пропустить

程序新视界-微信公众号