Spring @DateTimeFormat меняет часовой пояс при преобразовании @PathVariable в Date

2

Я пытаюсь использовать пружинное автоматическое преобразование String to Date при получении даты как @PathVariable с помощью @DateTimeFormat. Автоматическое преобразование выполняется, но по какой-то причине дата преобразуется в дату, которую я пропустил минус четыре часа (Easter Daylight Time, где расположены сервер и клиент).

Пример:

URL: .../something/04-10-2016/somename Результат будет иметь объект someDate со значением 2016/10/03 20:00:00 (т.е. 8 часов предыдущего дня, что на 4 часа меньше, чем я прошел. )

Как избежать этого автоматического изменения часового пояса. Мне не нужна информация о часовом поясе, и это преобразование нарушает ожидаемое поведение.

Вот мой код:

@RequestMapping(value = "/something/{someDate}/{name}", method = RequestMethod.GET, headers = "Accept=application/json")
@ResponseBody
public SomeObject getDetails(@PathVariable @DateTimeFormat(pattern = "dd-MM-yyyy") Date someDate,
    @PathVariable String name) {
    // date here comes as GMT - 4
    // more code here
    // return someObject;
}

Теперь я работаю над этим, просто прочитав переменную пути как String и используя SimpleDateFormatter, чтобы преобразовать String to Date вручную.

Любая идея о том, как я могу получить автоматическое преобразование без преобразования часового пояса?

Теги:
spring
spring-mvc
rest
datetime-format

3 ответа

1
Лучший ответ

Ответ Nhu Vy указал в правильном направлении; но вместо добавления информации о часовом поясе я должен был удалить ее.

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

Удалили это из конфигурации и оставили только часовой пояс по умолчанию. Это сработало для меня.

  • 1
    Привет, Сурадж, не могли бы вы поделиться URL ответа от Do Nhu
1

Причиной проблемы, вероятно, является часовой пояс, java.util.Date мгновенное время преобразуется обратно в Восточную часовую зону, следовательно, вы видите значение. Если вы используете Java 8, LocalDate должен решить эту проблему для вас.

@PathVariable @DateTimeFormat(pattern = "dd-MM-yyyy") LocalDate date

После публикации некоторых опций для вас аккуратно

https://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-parsing-date-and-time-information-from-a-request-parameter/

  • 1
    Я не пробовал это; но даже если бы это сработало, мне все равно пришлось бы преобразовать LocalDate в Date , поскольку используемый мной API принимает объект Date. Это почти так же хорошо, как использование SimpleDateFormatter .
0

У меня такая же проблема, и я только добавляю UTC в свой файл Serializer. Я имею в виду вместо:

private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateHourMinute();

Я использовал:

private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateHourMinute().withZoneUTC();

Это окончательный код полного JsonJodaDateTimeSerializer.java:

package cat.meteo.radiosondatge.commons;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

/**
 * When passing JSON around, it good to use a standard text representation of
 * the date, rather than the full details of a Joda DateTime object. Therefore,
 * this will serialize the value to the ISO-8601 standard:
 * <pre>yyyy-MM-dd'T'HH:mm:ss.SSSZ</pre> This can then be parsed by a JavaScript
 * library such as moment.js.
 */
public class JsonJodaDateTimeSerializer extends JsonSerializer<DateTime> {

    private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateHourMinute().withZoneUTC();

    @Override
    public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2)
            throws IOException, JsonProcessingException {

        gen.writeString(FORMATTER.print(value) + 'Z');
    }

}

Этот код был извлечен из Serializing Joda DateTime с помощью Jackson and Spring

Надеюсь, поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню