Дата и время Java8 с мгновенным API - PullRequest
0 голосов
/ 20 февраля 2020

Я получаю динамическую c дату из моего запроса,

Instant duration = request.getStartDate();   // my input is 2020-03-01T00:00:01Z
for (int i = 0; i < 12; i++) {
  duration  = duration.with(TemporalAdjusters.firstDayOfNextMonth ());
}

По сути, я хотел получить первый день каждого месяца в течение 12 месяцев, я пытался использовать приведенный выше код, но получаю исключение,

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfMonth

Мой вывод может быть,

2020-04-01T00:00:01Z
2020-05-01T00:00:01Z
2020-06-01T00:00:01Z
:
:
2021-03-01T00:00:01Z

что-то здесь отсутствует? попытался с помощью plus()

duration.plus(30, ChronoUnit.DAYS);

Я попытался преобразовать мгновенный в locateDate, затем он печатает нормально, но для моего необходимого формата мне нужно преобразовать в мгновенный из localdate. Я не вижу 1-го числа следующего месяца.


2019-03-31T22:00:00Z
2019-04-30T22:00:00Z
2019-05-31T22:00:00Z
2019-06-30T22:00:00Z
2019-07-31T22:00:00Z
2019-08-31T22:00:00Z
2019-09-30T22:00:00Z
2019-10-31T23:00:00Z
2019-11-30T23:00:00Z
2019-12-31T23:00:00Z

любые предложения приветствуются. Спасибо!

Ответы [ 2 ]

3 голосов
/ 21 февраля 2020

Намного менее рискованно, чем ответ моего однофамильца: при условии, что вы конвертируете в OffsetDateTime заранее, нет проблем с использованием удобного для восприятия человеком регулятора, который вы пытались использовать изначально.

OffsetDateTime duration = Instant.now().atOffset(ZoneOffset.UTC);
for (int i = 0; i < 12; i++) {
    duration = duration.with(TemporalAdjusters.firstDayOfNextMonth());
}

Проблема в том, что Instant является однозначным моментом времени, независимо от какого-либо определенного c часового пояса или географического положения c. Не существует определенной c даты, связанной с моментом; То, что понедельник 1-го в одном месте, может быть воскресенье 31-го в другом, но это все тот же момент. Вот почему при попытке установить первый день месяца вы получаете исключение.

Если вы конвертируете в OffsetDateTime, вы применяете смещение (в данном случае UT C, поэтому смещение нуля). Это преобразует ваши данные в формат, в котором дата является однозначной.

1 голос
/ 20 февраля 2020
Instant startInstant = request.getStartDate();
LocalDate start = startInstant.atZone(ZoneOffset.UTC).toLocalDate().withDayOfMonth(1);
for (int i = 0; i < 12; i++) {
    System.out.println(start.plusMonths(i).atStartOfDay().toInstant(ZoneOffset.UTC));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...