Я использую 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, можно ли что-то там изменить? Я ничего не могу придумать, но кто знает.