Функции новых функций 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 и пример》