我从具有事件日期/时间的提供程序那里获得了位于不同位置的一些事件的列表(事件位于不同的时区,因此日期/时间始终是本地的)。我需要在获取它们时将其保存到mongodb中,但是好像Mongo正在使用我的本地时区进行转换,因此不是在20:00开始的事件,而是在数据库中保存了18:00。
我正在使用Java Spring Boot应用程序,当我尝试过滤结果时,如果我选择19:00之后的事件,则我的事件不在列表中,但应该在该列表中。我想存储这些日期而不计算时区。有什么方法可以配置mongo不进行计算吗?我正在使用3.go版本的mongodb驱动程序。
更新(时间字段定义):
@Temporal(TemporalType.TIMESTAMP)
@Field("time")
private LocalDateTime time;
更新2:
我玩过shell,插入以下内容时:
var mydate2 = ISODate();
db.test.insertOne( { iso: mydate2 } );
结果是:
{ "_id" : ObjectId("5d5173dc6240209d9377677a"), "iso" : ISODate("2019-08-12T14:12:42.762Z") }
但是当我插入日期代替时:
var mydate2 = Date();
db.test.insertOne( { iso: mydate2 } );
结果是:
{ "_id" : ObjectId("5d51741b6240209d9377677b"), "iso" : "Mon Aug 12 2019 16:13:42 GMT+0200 (Central Europe Standard Time)" }
,所以正确的一种。
我可以从Spring文档定义中以某种方式说出我想使用Date吗?我应该使用ZonedDateTime而不是LocalDateTime吗?
最佳答案
我设法使用ZonedDateTime而不是LocalDateTime来解决此问题:
Spring Data Mongo文件中的定义
@Field("eventTime")
private ZonedDateTime eventTime;
Mongo没有自己的ZonedDateTime转换器,所以我创建了自己的转换器:
public class ZonedDateTimeReadConverter implements Converter<Date, ZonedDateTime> {
@Override
public ZonedDateTime convert(Date date) {
return date.toInstant().atZone(ZoneOffset.UTC);
}
}
和
public class ZonedDateTimeWriteConverter implements Converter<ZonedDateTime, Date> {
@Override
public Date convert(ZonedDateTime zonedDateTime) {
return Date.from(zonedDateTime.toInstant());
}
}
我们还需要在MongoDbConfig类中注册它,例如:
@Configuration
public class MongoDbCommonConfiguration {
@Bean
public ValidatingMongoEventListener validatingMongoEventListener() {
return new ValidatingMongoEventListener(validator());
}
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
@Bean
@Primary
public CustomConversions customConversions() {
ZonedDateTimeReadConverter zonedDateTimeReadConverter = new ZonedDateTimeReadConverter();
ZonedDateTimeWriteConverter zonedDateTimeWriteConverter = new ZonedDateTimeWriteConverter();
return new CustomConversions(Arrays.asList(zonedDateTimeReadConverter, zonedDateTimeWriteConverter));
}
}
当我获得事件提供程序时,我正在将其UTC区域的LocalDateTime更改为ZonedDateTime,例如:
return new Event(providerEvent.getTime().atZone(ZoneId.of("UTC")), providerEvent.getName(),...);
现在,当我从活动提供者那里获得18:00时,18:00将保存到mongodb中。
关于java - 如何在不计算时区的情况下将原始日期/时间存储到MongoDb,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57461759/