使用Java在MongoDB中插入日期

时间:2014-07-15 06:32:27

标签: java mongodb date datetime aggregation-framework

我在Dropwizard中有一个REST服务,它将客户端的数据存储到MongoDB,并在Dashboard上查询MongoDB以进行实时分析。

从客户端我获得了Key-Value对的JSON,其中我有一个日期字符串如下:

2014-07-14T05:58:20

和时区如下:

"Asia/Kolkata"

我必须将所有文档保存在UTC中的mongodb中。

我想根据时区和商店将日期转换为UTC。

我正在使用JodaDate这样做

DateTimeFormatter formatterInstance = DateTimeFormat
                        .forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZone(
                                DateTimeZone.forID(timeZone));
                dateInstance = formatterInstance.parseDateTime(timeString);
DateTime dtTz = dateInstance.withZone(DateTimeZone.UTC);

但是当我尝试在mongoDB中保存DateTime时,它会出现以下错误

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class org.joda.time.DateTime
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:261)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:226)
at com.mongodb.DBCollection.insert(DBCollection.java:75)
at com.mongodb.DBCollection.insert(DBCollection.java:59)
at com.mongodb.DBCollection.insert(DBCollection.java:104)
at com.datedemo.main.TimeZoneManager.getUTCTime(TimeZoneManager.java:65)
at com.datedemo.main.DateExample.main(DateExample.java:22)

Uptill现在我在NumberLong()中以毫秒DateTime.getMillis()存储日期,但是对于某些查询,例如当天聚合,LineChart显示其难以处理longNumber。

请建议任何其他方式,以便所有日期按照其时区以UTC格式存储。 我想避免REST服务本地时区对Date的任何转换。

1 个答案:

答案 0 :(得分:0)

你应该看看这三个会回答你问题的帖子。

How to deal with the timezone issue when storing dates in utc using mongod?

在mongodb JIRA中提交的bug,用于解决聚合时区问题。

https://jira.mongodb.org/browse/SERVER-6310

在JODA中设置默认时区

MongoDB, Java: Retrieve date property as UTC