You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot2集成MongoDB时如何将Date转为Unix时间戳?

解决Spring Boot 2 + MongoDB中Date转Unix时间戳的问题

嘿,我来帮你搞定这个日期序列化的问题!你当前遇到的情况是Jackson默认把Date序列化为毫秒级时间戳,而添加的WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS: true配置其实不是用来转成秒级Unix时间戳的——这个配置是控制是否将时间戳以纳秒精度输出(比如1515485462433000000),所以对你的需求没帮助。下面给你两种靠谱的解决方案:

方案一:给单个字段自定义序列化器

这种方式适合只需要特定字段转成Unix时间戳的场景:

  1. 先写一个自定义的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);
        }
    }
}
  1. 在你的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时间戳,推荐用全局配置,不用逐个字段加注解:

  1. 先创建一个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);
        };
    }
}
  1. 把之前写的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:25