使用SpringData-MongoDB将Java 8即时存储为BSON日期

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (18)

我有我想要使用Spring Data存储在MongoDB中的以下类

@Document()
public class Tuple2<T extends Enum<T>> {

@Id
private String id;

@Indexed
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private final Instant timeCreated;

...
}

DateTimeFormat注解javadoc指出:

声明一个字段应该被格式化为日期时间。支持通过样式模式,ISO日期时间模式或自定义格式模式字符串进行格式设置。可以应用于java.util.Date,java.util.Calendar,java.long.Long,Joda-Time值类型; 从Spring 4和JDK 8到JSR-310 java.time类型。

我使用Spring 4.1.1和JDK 8,所以我期望它适用于Instant。但是,这里是实际存储的内容:

"timeCreated" : {
    "seconds" : NumberLong(1416757496),
    "nanos" : 503000000
}

如果我从即时到日期编写并注册自定义转换器,那么它就可以工作,但是我想避免这种情况,因为我确信必须有更好的方法。

在进一步挖掘Spring源代码后,我发现以下Jsr310DateTimeFormatAnnotationFormatterFactory看起来很有前途的类:

使用JDK 8中的JSR-310 java.time包格式化使用DateTimeFormat批注注释的字段。

它的源代码没有引用Instant,但它引用了OffsetTime和LocalTime。即使如此,当我在我的示例中将Instant更改为OffsetDateTime时,仍然将其存储为复合对象而不是ISODate。

什么它不见​​了?

提问于
用户回答回答于

我认为这个问题就是你一直想用Instant的时间。从概念上讲,这是时间轴上的一点,并不意味着格式化。

正如我们所知,Java 8时间API是在焦点时间开发的(并且参与了joda时间的开发者)。这是来自joda-time的评论Instant

应该使用即时表示时间点,而不考虑任何其他因素,例如年表或时区。

所以,你应该使用自定义转换器或考虑使用更适合的类。

扫码关注云+社区