试图以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());
}
}
答案 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种常见情况:
如果您遇到其他情况或其他问题,请分享更多详细信息。