Как получить конец дня в виде OffsetDateTime в формате 2019-12-29 05: 59: 59.9999990 +00: 00? - PullRequest
0 голосов
/ 05 марта 2020

Предположим, что часовой пояс CST. У меня есть веб-сервис, который возвращает java.util.Date как "2020-03-14". Я хочу преобразовать его в OffsetDateTime в формате "2020-03-14 05:59:59.9999990 +00:00". Приведенный ниже код не имеет информации о времени.

Date endDate = someService.getEndDate();
Instant instant = Instant.ofEpochMilli(endDate.getTime());
OffsetDateTime offsetEndDt = OffsetDateTime.ofInstant(instant, ZoneOffset.UTC);

Значение offsetEndDt равно 2020-03-14T05:00Z

Ответы [ 3 ]

2 голосов
/ 05 марта 2020

OffsetDateTime не имеет никакого формата, он содержит информацию о дате и времени. Если вы создадите OffsetDateTime только из даты, он получит информацию о времени по умолчанию, равную 0 часам, минутам, секундам и нанограммам.
Вы можете вывести его в различных форматах, используя DateTimeFormatter, и создать новый экземпляр OffsetDateTime добавление временных единиц к существующей, например, так:

public static void main(String[] args) {
    // example OffsetDateTime 
    OffsetDateTime offsetEndDt = OffsetDateTime.of(2020, 3, 14, 0, 0, 0, 0,
                                                    ZoneOffset.UTC);
    // define a formatter for the output
    DateTimeFormatter myFormatter = DateTimeFormatter
                                    .ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnnnnn xxx");
    // print it using the previously defined formatter
    System.out.println(offsetEndDt.format(myFormatter));
    // create a new OffsetDateTime with time information
    OffsetDateTime realEndOfDay = offsetEndDt
                                    .withHour(23)
                                    .withMinute(59)
                                    .withSecond(59)
                                    .withNano(999999000);
    // print that, too
    System.out.println(realEndOfDay.format(myFormatter));
}

Создает следующий вывод, используя шаблон, который имеет желаемый выход вашего примера:

2020-03-14T00:00:00.000000000 +00:00
2020-03-14T23:59:59.999999000 +00:00
1 голос
/ 05 марта 2020

Сначала позвольте мне предложить вам представить конец вашего интервала НЕ за одну микросекунду до начала следующего дня, но AS первый момент следующего дня эксклюзивный . Таким образом, момент времени находится внутри вашего интервала, если он строго до вашего конечного времени. Это философски правильнее. И это исключает возможность ложного исключения момента времени в течение последних 999 наносекунд дня из вашего интервала.

    // Construct an example java.util.Date for the demonstration
    Instant exampleInstant = LocalDate.of(2020, Month.MARCH, 14)
            .atStartOfDay(ZoneId.systemDefault())
            .toInstant();
    Date enddt = Date.from(exampleInstant);

    System.out.println("Example java.util.Date: " + enddt);

    OffsetDateTime edt = enddt.toInstant()
            .atZone(ZoneId.systemDefault())
            .plusDays(1)
            .truncatedTo(ChronoUnit.DAYS)
            .toOffsetDateTime();

    System.out.println("End: " + edt);

В качестве одной из интерпретаций EST (из нескольких возможных) я запустил этот код в Америка / часовой пояс Atikokan (Америка / Виннипег дал мне EDT). Вывод был:

Example java.util.Date: Sat Mar 14 00:00:00 EST 2020
End: 2020-03-15T00:00-05:00

Если вы настаиваете на получении времени за 1 микросекунду до начала нового дня, вычтите микросекунду:

    OffsetDateTime edt = enddt.toInstant()
            .atZone(ZoneId.systemDefault())
            .plusDays(1)
            .truncatedTo(ChronoUnit.DAYS)
            .minus(1, ChronoUnit.MICROS)
            .toOffsetDateTime();
End: 2020-03-14T23:59:59.999999-05:00
0 голосов
/ 05 марта 2020

Сработали следующие строки кода.

Date enddt = someService.getEndDate();
Calendar cal = Calendar.getInstance();
cal.setTime(enddt);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
OffsetDateTime edt = OffsetDateTime.of(year,month+1,day,23,59,59,999999000,OffsetDateTime.now().toZonedDateTime().getOffset());
...