我在主題中收到了一個帶有日期和偏移量的字串欄位,我需要通過添加偏移量將此字串轉換為 LocalDateTime。例如,如果我收到:
2021-07-20T19:00:00.000 02:00
我想在 LocalDateTime 中轉換:
2021-07-20T21:00:00.000
為此,我有一個帶有自定義物件映射器的 Bean:
@Configuration
public class MyConfiguration {
@Bean
public MyCustomObjectMapper configure() {
final ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX");
final LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(formatter);
final LocalDateTimeSerializer dateTimeSerializer = new LocalDateTimeSerializer(formatter);
final JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
javaTimeModule.addSerializer(LocalDateTime.class, dateTimeSerializer);
mapper.registerModule(javaTimeModule);
return new MyCustomObjectMapper (mapper);
}
}
但它并沒有像我預期的那樣作業,因為生成的 LocalDateTime 偏移消失了并且沒有添加:
2021-07-20T19:00:00.000
我怎樣才能實作這個目標?
uj5u.com熱心網友回復:
該類是一個日期時間表示,它不知道時區,并且忽略源資料中的任何時區資訊LocalDateTime
是唯一合乎邏輯的。LocalDateTimeDeserializer
要考慮時區,您可以使用InstantDeserializer.OFFSET_DATE_TIME
反序列化器(DateTimeFormatter.ISO_OFFSET_DATE_TIME
實際上是您擁有的源日期時間的格式)并將其結果轉換為LocalDateTime
所需的區域內。這可以包裝在自定義解串器中以便于使用,例如
class SmartLocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {
private final InstantDeserializer<OffsetDateTime> delegate = InstantDeserializer.OFFSET_DATE_TIME;
public SmartLocalDateTimeDeserializer() {
super(LocalDateTime.class);
}
@Override
public LocalDateTime deserialize(JsonParser p,
DeserializationContext ctxt) throws IOException, JsonProcessingException {
final OffsetDateTime result = delegate.deserialize(p, ctxt);
return result.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime();
}
}
...
javaTimeModule.addDeserializer(LocalDateTime.class, new SmartLocalDateTimeDeserializer());
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471014.html
上一篇:使用Mono流處理例外