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

MongoDB无法识别org.joda.time.DateTime类型,如何存入数据库?

解决MongoDB存储Joda DateTime的编解码器异常

这个问题我之前也碰到过,本质是MongoDB Java驱动默认不认识Joda的DateTime类型,没法自动完成序列化/反序列化,所以抛出了CodecConfigurationException。给你几个可行的解决办法,按需选择就行:

方案一:转成Java原生Date类型(最简单快捷)

MongoDB驱动默认支持java.util.Date,所以直接把Joda DateTime转成这个类型就行,不需要额外依赖或配置:

DateTime dateTime = new DateTime();
BasicDBObject oldDoc = new BasicDBObject("email", email);
// 调用toDate()转成驱动支持的类型
BasicDBObject newDoc = new BasicDBObject("$set", new BasicDBObject("office_move_date", dateTime.toDate()));
collection.update(oldDoc, newDoc);

方案二:注册Joda DateTime编解码器(保留Joda类型操作)

如果你的项目大量使用Joda DateTime,不想每次手动转换,可以添加MongoDB官方提供的Joda编解码器依赖,然后注册到Mongo客户端:

1. 添加Maven依赖(版本和你的MongoDB驱动尽量匹配)

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-joda</artifactId>
    <version>3.12.14</version>
</dependency>

2. 创建MongoClient时注册编解码器

// 组合默认编解码器和Joda DateTime编解码器
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
    MongoClientSettings.getDefaultCodecRegistry(),
    CodecRegistries.fromCodecs(new DateTimeCodec())
);

// 配置客户端使用自定义注册表
MongoClientSettings settings = MongoClientSettings.builder()
    .codecRegistry(codecRegistry)
    .build();

MongoClient mongoClient = MongoClients.create(settings);

配置完成后,就可以直接把Joda DateTime对象存入MongoDB,驱动会自动处理序列化逻辑。

方案三:改用Java 8+日期API(长期推荐)

如果你的项目已经升级到Java 8或更高版本,建议改用java.time系列的日期类型(比如Instant、LocalDateTime),MongoDB驱动从3.7版本开始原生支持这些类型,不需要额外依赖,而且更符合Java的现代规范:

Instant now = Instant.now();
BasicDBObject oldDoc = new BasicDBObject("email", email);
BasicDBObject newDoc = new BasicDBObject("$set", new BasicDBObject("office_move_date", now));
collection.update(oldDoc, newDoc);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:33:53