Mongo数据库日期保存问题

时间:2019-02-23 11:49:52

标签: java mongodb

  

试图以Java应用程序在Mongo db中保存日期,但是在我尝试了下面提到的代码之前节省了一天。   我尝试使用Zonal日期时间转换器创建自定义转换,如果有人遇到过此类问题,请提供帮助。

 @Bean
public CustomConversions customConversions(){
    List<Converter<?,?>> converters = new ArrayList<Converter<?,?>>();
    converters.add(new DateToZonedDateTimeConverter());
    converters.add(new ZonedDateTimeToDateConverter());
    return new CustomConversions(converters);
}

@Bean
public MongoTemplate getMongoTemplate() throws UnknownHostException {
    MappingMongoConverter converter = new MappingMongoConverter(
            new DefaultDbRefResolver(getMongoDbFactory()), new MongoMappingContext());
    converter.setCustomConversions(customConversions());
    converter.afterPropertiesSet();
    return new MongoTemplate(getMongoDbFactory(), converter);
}

class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {

     @Override
     public ZonedDateTime convert(Date source) {
              return source == null ? null : ofInstant(source.toInstant(), systemDefault());
         }
     }

class ZonedDateTimeToDateConverter implements Converter<ZonedDateTime, Date> {

    @Override
    public Date convert(ZonedDateTime source) {
             return source == null ? null : Date.from(source.toInstant());
       }
   }

2 个答案:

答案 0 :(得分:0)

在保存期间,MongoDB会将您的日期转换为GMT时间。但是,如果您将日期再次拉到本地时区,则将有适当的时间。

如果您打算将应用程序用于具有不同区域的不同地理位置,则可以在后端使用GMT时区,而在前端使用本地时区。如果区域对于您的业务案例很重要,则可以将GMT时间和区域分别保存在mongodb中。

答案 1 :(得分:0)

您将无法在MongoDB中的日期对象内保存区域。 它看起来不好但是很好,我会尽力解释。

  

假设您要保存以下日期:

     
      
  • 德国/柏林为本地日期2019-09-20T00:20:00.000 GMT + 1
  •   
  • MongoDB会将日期转换为格林尼治标准时间,您将在数据库ISODate(“ 2019-09-19T23:20:00.000Z”)中看到(看起来像前一天   您描述)
  •   
     

如果获取此mongo文档并使用以下命令反序列化为Java对象   您可以打印日期的日期,您将看到:

     
      
  • 在德国和GMT + 1位置,您将打印您期望的2019-09-20T00:20:00.000 GMT + 1,因为Java java.util.Date自动将GMT转换为本地时间
  •   
  • 在其他位置,您将看到其他时间,例如在伦敦,您将看到2019-09-19T23:20:00 GMT及其确定时间,因为伦敦为1   柏林前一小时
  •   

解决方案取决于您的情况,但常见的错误是日期选择器,它提供了本地时间为00:00的日期,并且转换产生了问题。在这种情况下,只需从前端发送UTC日期。 您有2种常见情况:

  • 您需要节省在线通话的时间(您不需要位置,一些成员来自日本,一些来自德国,一些来自巴西) 在这种情况下,您可以从时间选择器发送本地时间,而mongo将转换为GMT。客户获取日期后,您将返回UTC,他们将自动转换为本地时间,所有客户都将看到正确的时间
  • 您需要节省面对面的约会时间(您需要保存位置,因为一些成员来自日本,一些来自德国,有些来自巴西,并假设他们必须知道当地时间) 在这种情况下,您可以将日期保存在一个字段中,并将tiemzone保存在第二个字段中。这样可以确保您想要的。

如果您遇到其他情况或其他问题,请分享更多详细信息。