为了账号安全,请及时绑定邮箱和手机立即绑定

Mongo db date 保存问题

Mongo db date 保存问题

哆啦的时光机 2022-07-06 17:15:38
试图在 java 应用程序中保存 Mongo db 中的日期,但在我尝试下面提到的代码之前它正在保存一天。我尝试使用区域日期时间转换器创建自定义转换,如果有人遇到这样的问题,请提供帮助。 @Beanpublic CustomConversions customConversions(){    List<Converter<?,?>> converters = new ArrayList<Converter<?,?>>();    converters.add(new DateToZonedDateTimeConverter());    converters.add(new ZonedDateTimeToDateConverter());    return new CustomConversions(converters);}@Beanpublic 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 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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

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


查看完整回答
反对 回复 2022-07-06
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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

假设您要从以下位置保存日期:

  • 德国/柏林为当地时间 2019-09-20T00:20:00.000 GMT+1

  • MongoDB 会将此日期转换为 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。这将确保你想要什么。

如果您有其他案例或其他问题,请分享更多详细信息。


查看完整回答
反对 回复 2022-07-06
  • 2 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信