大厦@ miklov-kriven的非常有用的答案,我希望考虑这两个附加分证明是有益的人:
(1)我觉得这是一个不错的主意,包括串行器和解串器的静态内部班级在同一班。注意,使用ThreadLocal来实现SimpleDateFormat的线程安全。
public class DateConverter {
private static final ThreadLocal<SimpleDateFormat> sdf =
ThreadLocal.<SimpleDateFormat>withInitial(
() -> {return new SimpleDateFormat("yyyy-MM-dd HH:mm a z");});
public static class Serialize extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator jgen SerializerProvider provider) throws Exception {
if (value == null) {
jgen.writeNull();
}
else {
jgen.writeString(sdf.get().format(value));
}
}
}
public static class Deserialize extends JsonDeserializer<Date> {
@Overrride
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws Exception {
String dateAsString = jp.getText();
try {
if (Strings.isNullOrEmpty(dateAsString)) {
return null;
}
else {
return new Date(sdf.get().parse(dateAsString).getTime());
}
}
catch (ParseException pe) {
throw new RuntimeException(pe);
}
}
}
}
(2)作为替代使用每个单独的类成员,你也可以考虑通过在应用级应用自定义序列覆盖杰克逊的默认序列化的@JsonSerialize和@JsonDeserialize注解,这是所有类成员类型Date将由Jackson使用此自定义序列化进行序列化,而不在每个字段上进行明确的注释。如果您在使用Spring启动例如一个办法做到这一点将按如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public Module customModule() {
SimpleModule module = new SimpleModule();
module.addSerializer(Date.class, new DateConverter.Serialize());
module.addDeserializer(Date.class, new Dateconverter.Deserialize());
return module;
}
}
如果格式还包含AM/PM指定,12小时格式会更好:DateFormat df = new SimpleDateFormat(“yyyy-MM-dd hh:mm a z”); –
尝试了所有这些解决方案,但无法将我的POJO的Date变量存储到Map键值中,也作为Date存储。 我想要这个从Map实例化一个BasicDbObject(MongoDB API),然后将这个变量作为Date(不是Long或String)存储在MongoDB DB集合中。 这甚至可能吗? 谢谢 – RedEagle
使用Java 8'LocalDateTime'或'ZonedDateTime'代替'Date'是否容易?由于'日期'基本上已被弃用(或至少它的许多方法),我想使用这些替代品。 – houcros