Отправка дат UT C на сервер с помощью fetch - PullRequest
0 голосов
/ 08 мая 2020

Я использую fetch для отправки даты на сервер. Это должна быть точная дата (без времени), потому что сервер использует там Java LocalDate.

В моем часовом поясе дата, такая как 2020-01-01, преобразована в 2019-12-31T23:00:00.000Z. Затем сервер отбрасывает временную часть. При преобразовании в LocalDate он не знает, в каком часовом поясе я нахожусь, я мог бы быть где угодно.

Поэтому я прибег к переопределению Date.prototype.toJSON с помощью функции, которая перемещает дату в UT C так что он будет преобразован в 2020-01-01T00:00:00.000Z. Это, конечно, очень уродливо, но, по крайней мере, это работает.

Тогда я подумал, давайте переопределим toJSON прямо перед запросом и сбросим его после того, как запрос вернется. Но что бы я ни пробовал (дополнительные обещания, таймауты), fetch использует собственный toJSON. Так что это не работает:

    Date.prototype.toJSON = function () {
        return ... // Date moved to UTC. This works when set when the page loads.
    }

    const response = await fetch(...) // Fetch uses the native toJSON

    // Setting a breakpoint here reveals that toJSON is my version as expected. But fetch didn't use it.
    Date.prototype.toJSON = toJSON // Reset back to native

Я читал о задачах и микрозадачах, но не нашел ничего, что могло бы это объяснить.

Я также не нашел никого с такой же проблемой, поэтому я ' м, вероятно, ошибаюсь.

Итак, мои вопросы:

  • Как отправить дату в любом часовом поясе на сервер, чтобы она была правильно преобразована в LocalDate (кроме глобального переопределения toJSON)?
  • Как fetch использует собственный toJSON, если он был переопределен прямо перед этим? Просто чтобы я понял, что происходит.
  • Сервер построен с использованием фреймворка Micronaut, можно ли что-то там изменить? Я ничего не могу придумать, но кто знает.
...