Mongo db date 保存问题

试图在 java 应用程序中保存 Mongo db 中的日期,但在我尝试下面提到的代码之前它正在保存一天。我尝试使用区域日期时间转换器创建自定义转换,如果有人遇到这样的问题,请提供帮助。


 @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());

       }

   }


哆啦的时光机
浏览 214回答 2
2回答

哈士奇WWW

MongoDB 将在保存期间将您的日期转换为 GMT 时间。但是,如果您再次将日期拉到本地时区,您将有适当的时间。如果您的应用程序适用于具有不同区域的不同地理位置,则可以在后端使用 GMT 时区,在前端使用本地时区。如果区域对您的业务案例很重要,您可以将 GMT 时间和区域分别保存在 mongodb 中。

慕的地6264312

您将无法在 MongoDB 中的日期对象内保存区域。它只是看起来很糟糕,但它很好,我会尽力解释。假设您要从以下位置保存日期:德国/柏林为当地时间 2019-09-20T00:20:00.000 GMT+1MongoDB 会将此日期转换为 GMT,您将在数据库中看到 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 日期。您有两种常见情况:您需要节省在线通话时间(您不需要位置,一些成员来自日本,一些来自德国,一些来自巴西)在这种情况下,您可以从您的时间选择器发送本地时间,mongo 将转换为 GMT。当客户端获取日期时,您将返回 UTC,它们将自动转换为本地时间,所有客户端都会看到正确的时间您需要节省面对面预约的时间(您需要保存位置,因为一些成员来自日本,一些来自德国,一些来自巴西,假设他们必须知道当地时间)在这种情况下,您可以将日期保存在一个字段和第二个字段中的 tiemzone。这将确保你想要什么。如果您有其他案例或其他问题,请分享更多详细信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java