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

Spring JPA查询MongoDB时如何将ISODate转为时间戳

解决方案

方案1:自定义MongoDB类型转换器(推荐)

通过实现Spring Data MongoDB的转换器,让MongoDB的Date类型在映射到JsonNode时自动转为时间戳(Long类型):

  1. 定义读取转换器,将Date转为Long:
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import java.util.Date;

@ReadingConverter
public class DateToLongConverter implements Converter<Date, Long> {
    @Override
    public Long convert(Date source) {
        return source != null ? source.getTime() : null;
    }
}
  1. 注册转换器到MongoDB配置类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import java.util.List;

@Configuration
public class MongoConfig {
    @Bean
    public MongoCustomConversions mongoCustomConversions() {
        return new MongoCustomConversions(List.of(new DateToLongConverter()));
    }
}

配置完成后,MongoTemplate将Document映射到Dto的JsonNode时,所有Date类型字段会自动转为时间戳,无需手动遍历处理。

方案2:定制Jackson的ObjectMapper

通过定制Jackson的ObjectMapper,直接控制JsonNode的日期序列化行为:

  1. 配置自定义ObjectMapper:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.TimeZone;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 开启日期序列化为时间戳,关闭ISO格式输出
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
        mapper.setTimeZone(TimeZone.getDefault());
        return mapper;
    }
}
  1. 让Spring Data MongoDB使用该ObjectMapper处理映射:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

@Configuration
public class MongoConfig {
    private final ObjectMapper objectMapper;

    public MongoConfig(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoMappingContext context) {
        MappingMongoConverter converter = new MappingMongoConverter(context);
        converter.setObjectMapper(objectMapper);
        return converter;
    }
}

该方案通过Jackson全局配置,让所有Date类型在序列化为JsonNode时输出时间戳,同样能避免手动遍历Document的冗余操作。

补充说明

你之前手动遍历Document转换日期的方法虽可行,但冗余且易遗漏嵌套结构。上述两种方案依托Spring Data的自动映射机制实现转换,更符合框架设计理念,也更易维护。

内容的提问来源于stack exchange,提问作者rwachter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:35:32