我有这样一个POST API:
@JsonDeserialize(using = MyCustomDeserializer.class)
@JsonSerialize(using = MyCustomSerializer.class)
@NotNull(message = "fromDate should not be blank!")
@FutureOrPresent(message = "fromDate must be of Future or Present")
private Instant fromDate;我的实用程序包中有自定义序列化程序和反序列化程序,如下所示:
public class MyCustomSerializer extends JsonSerializer<Instant> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);
@Override
public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
String str = fmt.format(value);
gen.writeString(str);
}
}public class MyCustomDeserializer extends JsonDeserializer<Instant> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
LocalDate date = LocalDate.parse(p.getText());
return Instant.from(fmt.parse(date.toString()));
}
}我想在内部保存时间组件作为一天的开始。API应该只由date接收和输出。
我尝试将this转换为Instant。有人能帮助我如何做到这一点(将db存储为date+start_of_day)并将其作为yyyy公开/消费吗?
发布于 2021-10-15 13:46:37
TL;DR
return date.atStartOfDay(ZoneOffset.UTC).toInstant();(未经测试,请原谅任何输入错误。)
详细信息
你真想把正方形的钉子插进圆孔里。Instant是一个时间点,在那个时间点上,它是两个或三个不同时区的不同日期。适应UTC会有帮助,然后我们就可以让它开始工作了。但还是不太理想。该差异的标准解决方案(hack)是将日期表示为某个时区的一天的开始,UTC是一个很好的选择。
为什么您的代码不起作用
在反序列化器中解析日期(格式化后)将给出日期和UTC偏移量,但不提供一天中的时间。我们需要这三个人来确定一个明确的时间点。相反,在我的代码中,我明确地指定了一天的开始。
https://stackoverflow.com/questions/69558412
复制相似问题