我从具有事件日期/时间的提供程序那里获得了位于不同位置的一些事件的列表(事件位于不同的时区,因此日期/时间始终是本地的)。我需要在获取它们时将其保存到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/

10-12 07:28
查看更多