Как преобразовать LocalDateTime в Date игнорируемый часовой пояс? - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу вычесть часы из LocalDateTime и преобразовать их в Date, но мой способ всегда обходит фактор TimeZone.

Date fromDate = request.getFromDate();
LocalDateTime reqFromDate = LocalDateTime.ofInstant(fromDate.toInstant(), ZoneOffset.UTC).truncatedTo(ChronoUnit.DAYS);
Date fromDateArg = Date.from(reqFromDate.minusHours(11).toInstant(ZoneOffset.UTC));

Например:

2020-01-01T20: 00 >> Я хочу точно: 2020-01-01T9: 00 дата, независимая от часового пояса.

Включенный часовой пояс может повлиять на результат, который передается в запрос в качестве параметра привязки. Как мне от этого избавиться?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы спрашиваете о невозможном. LocalDateTime само по себе не определяет момент времени. Date, с другой стороны, - это точка во времени (несмотря на имя класса). Так как же возможно преобразование? Какое преобразование вы хотите?

Чтобы добавить небольшую глубину, LocalDateTime - это дата и время дня без часового пояса. Local в некоторых именах классов в java .time означает «без смещения или часового пояса». Чтобы интерпретировать LocalDateTime в определенный момент времени, сначала необходимо выполнить интерпретацию в некотором часовом поясе, оставляя место для промежутка времени около 26 часов.

A Date не может представлять 2020-01-01T09:00 независимо от времени зона. Никогда. Он может представлять момент времени, который в некотором часовом поясе будет отображаться как 2020-01-01T09:00.

Вы правы, что часовой пояс влияет на результат, который вы получаете. Именно поэтому он нам нужен для преобразования.

Вы сказали в комментарии, что он нужен для параметра связывания JPA. Интересно, если это необходимо. Чтобы передать дату и время, не зависящие от часового пояса, в ваш запрос JPA, передайте LocalDateTime. Современная реализация JPA должна принять это.

Если невозможно передать современный класс в JPA, преобразование с использованием часового пояса по умолчанию вашей JVM (ZoneId.systemDefault()), вероятно, даст вам то, что вы хотите. В этом часовом поясе принято интерпретировать Date.

1 голос
/ 20 февраля 2020

Вы пробовали "OffsetDateTime"? Дата-время со смещением от UTC / Гринвич в календарной системе ISO-8601,

...