Я пытаюсь использовать пружинное автоматическое преобразование 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 вручную.
Любая идея о том, как я могу получить автоматическое преобразование без преобразования часового пояса?
Ответ Nhu Vy указал в правильном направлении; но вместо добавления информации о часовом поясе я должен был удалить ее.
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Удалили это из конфигурации и оставили только часовой пояс по умолчанию. Это сработало для меня.
Причиной проблемы, вероятно, является часовой пояс, java.util.Date мгновенное время преобразуется обратно в Восточную часовую зону, следовательно, вы видите значение. Если вы используете Java 8, LocalDate должен решить эту проблему для вас.
@PathVariable @DateTimeFormat(pattern = "dd-MM-yyyy") LocalDate date
После публикации некоторых опций для вас аккуратно
LocalDate
в Date
, поскольку используемый мной API принимает объект Date. Это почти так же хорошо, как использование SimpleDateFormatter
.
У меня такая же проблема, и я только добавляю 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
Надеюсь, поможет.