Время понять API Java8

Java

До 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));
}

Суммировать

理解Java8中的时间API

API нового времени в Java очень мощный. Я могу представить вам только несколько сценариев, с которыми я столкнулся во многих случаях. Я говорю только о самых основных и поверхностных вещах. Чтобы хорошо освоить все детали, вам все еще нужно чтобы посмотреть на API.Или реализация исходного кода, а затем медленно накапливаться в обычных конкретных сценариях спроса.

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

Если эта статья была вам полезна, ставьте лайк, спасибо

Для более интересного контента, пожалуйста, обратите внимание на личный публичный номер.