Просто у меня есть следующий класс, чтобы получить тело JSON, полученное из удаленного ответа для десериализации, до CreditCardDTO
даты, полученной внутри exp_date
, например, «0820» для 8/2010 и «0240» для 2/2040:
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Date;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonPropertyOrder(alphabetic = true)
public class CreditCardDTO {
private String brand;
private Date expirationDate;
@JsonProperty("brand")
public String getBrand() {
return brand;
}
@JsonProperty("credit_card_type")
public CreditCardDTO setBrand(String brand) {
this.brand = brand;
return this;
}
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
@JsonProperty("expirationDate")
public Date getExpirationDate() {
return expirationDate;
}
@JsonFormat(pattern = "MMyy")
@JsonProperty("exp_date")
public CreditCardDTO setExpirationDate(Date expirationDate) {
System.out.println(expirationDate);
this.expirationDate = expirationDate;
return this;
}
}
Проблема в том, что если это до 2038 года, все в порядке, но как только данные после этой критической даты, это все равно происходит, данные возвращаются к 1941 году, я искал проблему и обнаружил, что этого не должно происходить в Java 8 : Почему программисту на Java нужно заботиться о ошибка 2038 года?, так что мне интересно, в чем тут проблема!
Джексон версия 2.8.0, Java 8 точно.
java.util.Date
, который все еще принадлежит старому набору функций Java. Чтобы использовать преимущества Java 8, вам необходимо использовать классы из пакетовjava.time
. - person RealSkeptic   schedule 03.07.2017System.out.println(new java.util.Date(Long.MAX_VALUE));
giveSun Aug 17 08:12:55 CET 292278994
на Java 8. Так что вы можете проверить, как Джексон управляетDate
преобразованием - person AxelH   schedule 03.07.2017SimpleDateFormat
, чтобы узнать, как он это решит. И переключитесь на использование четырехзначного числа лет для передачи данных. - person RealSkeptic   schedule 03.07.2017two-digit year
этот урок должен быть извлечен из проблемы 2000 года, но я должен иметь дело с этим удаленным API, разработанным парнем в старом стиле, он сказал, что может Не меняю это из-за того, что он запущен в другом старом проекте. - person Al-Mothafar   schedule 03.07.2017new java.text.SimpleDateFormat("MMyy").parse("0240")
›Thu Feb 01 00:00:00 CET 1940
. Подтверждающий комментарий RealSkeptic (кстати). Поэтому, если вы не можете обновить _ 3_, ты **** - person AxelH   schedule 03.07.2017SimpleDateFormat
javadoc, которая говорит, что он выполняет [анализ двузначных лет], устанавливая даты в пределах 80 лет до и 20 лет после создания экземпляра SimpleDateFormat (отмечая, что 2040 год наступит более чем через 20 лет). Есть более важные вещи до и после. - person Andy Turner   schedule 03.07.2017java.time.LocalDate
иjava.util.Date
преобразования для 2-значного года. Как вы сказали, вы не можете обновить API, поэтому у вас нет решения здесь. Просто подождите 3 года, чтобы пройти 2040 год. - person AxelH   schedule 03.07.2017java.time.YearMonth
как например - person Al-Mothafar   schedule 03.07.2017java.time
API. Я считаю, что вы можете использовать его с Джексоном, если получите jackson-datatype-jsr310. - person Ole V.V.   schedule 03.07.2017