micronaut конвертировать параметры запроса в Instant или ZonedDateTime - PullRequest
1 голос
/ 13 апреля 2020

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

Я хотел бы преобразовать введенную дату в Instant или OffsetDateTime

    @Get("/...")
    public List<Obj> method(
//            @Format("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
//                    Instant startDateTime,
            @Format("yyyy-MM-dd")
                    LocalDate endDateTime
    ) {

, который я хотел бы использовать ISO 8601, если это возможно.

входы, которые я пробовал:

2013-02-04
2013-02-04T22:44:30.652Z
...

Вывод, который я получаю:

"message": "Required argument [LocalDate endDateTime] not specified",

Мой запасной вариант:

        String startDateTime

        Instant parse = Instant.parse(startDateTime);
        OffsetDateTime parse = OffsetDateTime.parse(startDateTime);

Но я все еще хотел бы знать, как это сделать с Micronaut.

1 Ответ

1 голос
/ 13 апреля 2020

Вот пример того, как вы можете передать LocalDateTime в качестве параметра запроса в Micronaut:

@Get("/local")
public String local(@Format("yyyy-MM-dd'T'HH:mm:ss") @QueryValue LocalDateTime time) {
    return "Time " + DateTimeFormatter.ISO_DATE_TIME.format(time);
}

Пример вызова curl с результатом:

$ curl http://localhost:8080/example/local?time=2020-04-13T21:13:59
Time 2020-04-13T21:13:59

Вы можете использовать LocalDateTime когда часовой пояс всегда одинаков. И вы можете преобразовать его в Instant следующим образом time.atZone(ZoneId.systemDefault()).toInstant().

Если часовой пояс может отличаться и должен быть частью времени ввода, тогда вы можете использовать параметр ZonedDateTime, например:

@Get("/zoned")
public String method(@Format("yyyy-MM-dd'T'HH:mm:ss.SSSZ") @QueryValue ZonedDateTime time) {
    return "Time " + DateTimeFormatter.ISO_DATE_TIME.format(time);
}

Где преобразование в Instant является простым: time.toInstant()

Пример вызова curl с результатом:

$ curl http://localhost:8080/example/zoned?time=2020-04-13T21:13:59.123-0100
Time 2020-04-13T21:13:59.123-01:00

Когда вы вводите параметр запроса времени в плохой формат (здесь отсутствует доля секунд и смещение зоны), тогда он ведет себя так:

$ curl http://localhost:8080/example/zoned?time=2020-04-13T21:13:59
{"message":"Required QueryValue [time] not specified","path":"/time","_links":{"self":{"href":"/example/zoned?time=2020-04-13T21:13:59","templated":false}}}

Вы также можете использовать время как часть пути запроса:

@Get("/local/{time}")
public String local(@Format("yyyy-MM-dd'T'HH:mm:ss") LocalDateTime time) {
    return "Time from request path " + DateTimeFormatter.ISO_DATE_TIME.format(time);
}

Тогда пример вызова curl будет:

$ curl http://localhost:8080/example/local/2020-04-13T21:13:59
Time from request path 2020-04-13T21:13:59

Когда вы вводите время в пути в неверном формате (здесь нежелательная доля секунд), тогда он ведет себя так:

$ curl http://localhost:8080/example/local/2020-04-13T21:13:59.111
{"message":"Failed to convert argument [time] for value [2020-04-13T21:13:59.111] due to: Text '2020-04-13T21:13:59.111' could not be parsed, unparsed text found at index 19","path":"/time","_links":{"self":{"href":"/example/local/2020-04-13T21:13:59.111","templated":false}}}
...