首页 > 解决方案 > Mongodb java驱动程序在使用聚合读取时自动将日期转换为本地机器时区

问题描述

以 utc 时区形式存储在数据库中的日期。但是当使用聚合从数据库中检索它时,它会自动转换为我的本地机器时区。这是因为 Mongodb java 驱动程序吗?例如我存储:一个文件---

{"_id":"5d72010ef608c30a0b33be8f","salesDate":"2019-09-06T06:47:42.184Z"}

使用 MongoDb 罗盘读取时,它显示的 salesDate 与上面相同,但使用 mongodb java 驱动程序检索时:

MongoCollection<Document> collectionDoc = database.getCollection(this.collectionName);
AggregateIterable<Document> output = collectionDoc.aggregate(agg);

for (Document document : output) {
    System.out.println("document: " + document);
}


请注意,没有进行任何转换,但是当使用 for 循环将输出打印到控制台时,它会显示 salesDate 和我的本地机器时区。

document: Document{{_id=5d72010ef608c30a0b33be8f, salesDate=Fri Sep 06 13:47:42 ICT 2019}}

我正在使用 MongoDB java 驱动程序版本 3.11.0-beta4,java 8。任何想法吗?是驱动程序自动转换为本地机器时区还是使用 os 时区的 Java?

标签: javamongodb

解决方案


驱动程序将数据库的内容作为 java.util.Date 对象返回。它对时间所代表的时区一无所知。它不会在任何地方存储时区。Mongo Shell 始终将时间值显示为 UTC。

话虽这么说,如果您想在应用程序代码中始终将其作为 UTC 使用,请在代码本身中将我的时区设置为 UTC,如下所示,

DateTimeZone zone = DateTimeZone.UTC;
DateTimeZone.setDefault(zone);

如果您只想为 joda 时间设置默认时区,请使用DateTimeZone.setDefault。


推荐阅读