Spring Boot2集成MongoDB时如何将Date转为Unix时间戳?
解决Spring Boot 2 + MongoDB中Date转Unix时间戳的问题
嘿,我来帮你搞定这个日期序列化的问题!你当前遇到的情况是Jackson默认把Date序列化为毫秒级时间戳,而添加的WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS: true配置其实不是用来转成秒级Unix时间戳的——这个配置是控制是否将时间戳以纳秒精度输出(比如1515485462433000000),所以对你的需求没帮助。下面给你两种靠谱的解决方案:
方案一:给单个字段自定义序列化器
这种方式适合只需要特定字段转成Unix时间戳的场景:
- 先写一个自定义的Jackson序列化器,把
Date转成秒级时间戳:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.util.Date; public class UnixTimestampSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { if (date != null) { // 把毫秒时间戳除以1000得到秒级Unix时间戳 jsonGenerator.writeNumber(date.getTime() / 1000); } } }
- 在你的
Card实体类的registeredDateTime字段上添加@JsonSerialize注解,指定使用这个序列化器:
@JsonInclude(JsonInclude.Include.NON_DEFAULT) @QueryEntity public class Card { @Id @JsonProperty("id") @Field("_id") String id; @JsonProperty("main_reg_dt") @Field("main_reg_dt") @JsonSerialize(using = UnixTimestampSerializer.class) Date registeredDateTime; }
方案二:全局配置,所有Date字段自动转Unix时间戳
如果你的项目里很多Date字段都需要转成Unix时间戳,推荐用全局配置,不用逐个字段加注解:
- 先创建一个Jackson配置类,注册自定义的序列化器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import com.fasterxml.jackson.databind.module.SimpleModule; @Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> { SimpleModule module = new SimpleModule(); module.addSerializer(Date.class, new UnixTimestampSerializer()); builder.modules(module); }; } }
- 把之前写的
UnixTimestampSerializer放在项目能扫描到的包下即可,这样所有Date类型的字段都会自动序列化为秒级Unix时间戳。
补充说明
如果你其实想要的还是毫秒级时间戳,但之前的配置没生效,那可能是因为spring.jackson.serialization.write-dates-as-timestamps默认就是true,所以不管你加不加WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,都会输出毫秒数。如果要确认配置是否生效,可以把WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS设为true,此时输出会变成纳秒级的数字(比如1515485462433000000)。
内容的提问来源于stack exchange,提问作者Kyeong Wook Ma
相关产品推荐
相关产品推荐

