До Java8 в процессе разработки Java, если вы хотите манипулировать временем, вы использовали класс Date.В Java8 были добавлены LocalTime, LocalDate и LocalDateTime, и обработка даты и времени стала более удобной и простой. Попользовавшись им какое-то время, мне приходилось каждый раз рыться в Интернете, чтобы найти нужный мне ответ. Позже я внимательно изучил API официального сайта и обнаружил, что это не так сложно понять. Теперь я Я могу найти то, что хочу, благодаря своему собственному пониманию.Выражение, вот небольшое резюме обучения.
Почему новый API времени
Поскольку класс Date существует уже столько лет, почему потребовалось столько усилий, чтобы внести это изменение? Какая польза?
Во-первых, поскольку класс Date действительно сложен в использовании, многие схемы слишком гиковские, например, месяц начинается с 0, 0 — это январь, а 11 — это декабрь. Ну, я уже знаю, что программатор начинает считать с 0, но каждый раз, когда вы его используете, вам приходится делать различные преобразования, особенно когда вы взаимодействуете с другими выходами, если вы поменяете одно неправильное место, это будет беспорядок. в новом APIjava.time
В , они представлены константами, которые можно правильно использовать, и код выглядит более понятным.
В бизнес-коде, часто есть много потребностей, получите один день 0:00, чтобы получить следующий день в полдень времени, текущее время будет двигаться вперед или назад через несколько дней, и поэтому этот вид спроса на эти функции используют Урок даты с календарем написать много кода, простота кода также не достаточно хорош.
С другой стороны, многие методы в Date устарели, и если новые проекты решаются использовать эти классы, то они зарывают себе дыру, и их лучше менять как можно скорее.
класс старых временjava.util.Date
и класс форматированияSimpleDateFormatter
Все они являются классами переменных и не потокобезопасны.При работе с общей переменной Date в многопоточной среде вам необходимо самостоятельно обеспечить потокобезопасность. И новый API времениLocalTime
иLocalDate
и класс форматированияDateTimeFormatter
Они являются конечным классом (неизменяемым) и потокобезопасными.
По этим причинам нет причин не использовать новый API времени.
Переход с инструмента, которым вы пользовались годами, на новый всегда мучителен, но результаты прекрасны.
Как понять новый API времени
В API нового времени естьLocalTime
,LocalDate
,LocalDateTime
три класса,LocalTime
Только обрабатывать время, не может включать дату,LocalDate
Работает только с датами, не может включать время, толькоLocalDateTime
Может обрабатывать дату и время одновременно.
как пользоваться?
Если вы понимаете разницу между тремя классами, то при использовании вам нужно иметь дело с ним в соответствии с конкретной ситуацией.Давайте рассмотрим наиболее часто встречающиеся сценарии.
LocalDate
Возьмем только дату, год месяц день.
Получить сегодняшнюю дату
LocalDate today = LocalDate.now();// 2020-05-20
Построить дату, используя год месяц день
LocalDate valentineDay = LocalDate.of(2020, 5, 20); // 月份和日期是从1开始
Укажите объект, чтобы получить год, месяц, день, день недели
int year = localDate.getYear();
Month month = localDate.getMonth();
int day = localDate.getDayOfMonth();
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
или
int year = localDate.get(ChronoField.YEAR);
int month = localDate.get(ChronoField.MONTH_OF_YEAR);
int day = localDate.get(ChronoField.DAY_OF_MONTH);
int dayOfWeek = localDate.get(ChronoField.DAY_OF_WEEK);
LocalTime
Чтобы получить время, потребуется всего несколько минут и несколько секунд.
Инициализировать объект времени
LocalTime localTime = LocalTime.now();
Создает объект, используя часы, минуты и секунды
LocalTime localTime = LocalTime.of(12, 0, 0);
Указать объект, получить запас времени
LocalTime localTime = LocalTime.now();
int hour = localTime.getHour();
int minute = localTime.getMinute();
int second = localTime.getSecond();
int hour = localTime.get(ChronoField.HOUR_OF_DAY);
int minute = localTime.get(ChronoField.MINUTE_OF_HOUR);
int second = localTime.get(ChronoField.SECOND_OF_MINUTE);
LocalDateTime
Получить дату + время, год, месяц, день + час, минуту, секунду, что означает равенство LocalDate + LocalTime.
Создать временной объект
LocalDateTime localDateTime = LocalDateTime.now();
Используйте LocalDate в сочетании с LocalTime для создания объекта времени
LocalDateTime localDateTime = LocalDateTime.of(localData, localTime);
LocalDateTime localDateTime = localDate.atTime(localTime);
LocalDateTime localDateTime = localTime.atDate(localDate);
Получить LocalDate и LocalTime через LocalDateTime
LocalDate localDate = localDateTime.toLocalDate();
LocalTime localDate = localDateTime.toLocalTime();
Instant
Этот класс представляет собой временную точку, представляющую определенный момент на временной шкале. от1970-01-01 00:00:00Это время начинает вычисляться, в основном используется для получения временных меток, иSystem.currentTimeMillis()
(до миллисекунды) аналогично, но класс Instant может быть точным до наносекунд.
Создать мгновенный объект
Instant instant = Instant.now();
Создать мгновенный объект с отметкой времени
Instant instant = Instant.ofEpochSecond(100, 100000);
Получить секунды и миллисекунды
instant.getEpochSecond();
instant.getEpochMill();
пример, чтобы произвести впечатление
После представления базового API этих классов мы можем углубить впечатление, реализовав некоторые специфические требования.
Получить текущую метку времени
// 获取当前时间对象->设置时->转换成时间戳
public static long getCurrentSeconds() {
return Instant.now().atZone(ZoneOffset.of("+8")).toEpochSecond();
}
Получить метку времени нулевого/конечного времени текущего дня
// 使用日期和时间构造日期时间对象->指定时区转换成时间戳
public static long getTodayStartTime() {
return LocalDateTime.of(LocalDate.now(), LocalTime.MIN).toEpochSecond(ZoneOffset.of("+8"));
}
public static long getTodayEndTime() {
return LocalDateTime.of(LocalDate.now(), LocalTime.MAX).toEpochSecond(ZoneOffset.of("+8"));
}
Получить ноль часов предыдущего дня
// 使用日期和时间构造日期时间对象->修改日期->指定时区转换成时间戳
public static long getYesterdayStartTime() {
return LocalDateTime.of(LocalDate.now(), LocalTime.MIN).minusDays(1).toEpochSecond(ZoneOffset.of("+8"));
}
Получить время, представленное отметкой времени, в соответствии с отметкой времени в 0:00 текущего дня.
// 使用时间戳构造日期时间对象->修改日期->指定时区转换成时间戳
public static long getDayStartTime(long ) {
return LocalDateTime.of(LocalDate.now(), LocalTime.MIN).minusDays(1).toEpochSecond(ZoneOffset.of("+8"));
}
Определить, является ли первый день месяца
public static boolean isFirstDayOfMonth(String ymd) {
LocalDate localDate = LocalDate.parse(ymd, DateTimeFormatter.ofPattern("yyyyMMdd"));
return localDate.equals(localDate.withDayOfMonth(1));
}
Суммировать
API нового времени в Java очень мощный. Я могу представить вам только несколько сценариев, с которыми я столкнулся во многих случаях. Я говорю только о самых основных и поверхностных вещах. Чтобы хорошо освоить все детали, вам все еще нужно чтобы посмотреть на API.Или реализация исходного кода, а затем медленно накапливаться в обычных конкретных сценариях спроса.
Оригинал статьи, ограниченный стиль написания, недостаток знаний и знаний, если есть неточности в статье, сообщите пожалуйста.
Если эта статья была вам полезна, ставьте лайк, спасибо
Для более интересного контента, пожалуйста, обратите внимание на личный публичный номер.