使用mongodb中的日期保存TimeZone

时间:2016-11-09 08:34:09

标签: java mongodb java.util.date

我的文档类中有java.util.Date字段。

E:G:

@Document(collection = "testdoc")
public class TestDoc {
    @Id
    String id;
    Date startDate;
}

即使我使用UTC和IST设置日期,它也会保存在我的收藏中,如下所示

 "startDate" : ISODate("2015-08-21T18:30:00.000Z")

如何在mongo集合中保存时区?在这种情况下,Z代表什么?

4 个答案:

答案 0 :(得分:5)

在存储之前进行转换并始终保存为UTC。然后在显示之前在您想要的时区重新转换它。

如果您迫切希望使用偏移量存储时区,则可能需要在db中将其作为单独的字符串处理,但它不能与MongoDB的日期字段一起使用。

目前MongoDB不允许保存时区。 以下是开放的JIRA问题或相同的问题。

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

答案 1 :(得分:5)

' Z'表示时间以UTC格式存储。 Mongo在存储之前在内部转换所有本地时间表示。但是,一个建议是将时间与从您的应用程序收到的时区一起存储。您可以稍后从应用程序逻辑中的UTC时间和时区重建本地时间。

请浏览此链接。他们举了一个关于如何使用JavaScript建模本地时间数据的例子。

https://docs.mongodb.com/v3.2/tutorial/model-time-data/

答案 2 :(得分:0)

MongoDB中的日期存储在UTC中。没有像某些关系数据库中那样带有时区数据类型的时间戳。需要根据本地时间访问和修改时间戳的应用程序应将时区偏移以及日期和偏移日期存储在应用程序级别。

在MongoDB Shell中,可以使用以下格式的JavaScript来完成此操作:

let now = new Date();
db.page_views.save({date: now,                    
                    offset: now.getTimezoneOffset()});

然后,您需要应用保存的偏移量来重建原始本地时间,如以下示例所示:

let record = db.page_views.findOne();
let localNow = new Date( record.date.getTime() - ( record.offset * 60000 ) );

答案 3 :(得分:0)

我想here您会找到一个很好的指南,说明如何在独立于不同数据语言的不同情况下处理时间戳。 按照文档中的建议,即使使用本地时区,也始终使用UTC保存数据。如有必要,将时区保存在单独的字段(JSON或xml)中,并遵循格式准则ISO8601。(就像您所做的一样,但是有很多可能的表示形式) 据我所知,如果我错了,请纠正我,JSOn不会处理特定的日期格式,而JS可以。 Microsoft文档建议基于ECMA YYYY-MM-DDTHH:mm:ss.sssZ this的followind格式 时间戳记中的Z表示其为UTC格式,零偏移量为+00:00 如果没有其他添加。 如果要使用“ Z”表示法,则必须在时间戳内添加或减去偏移量,而不是编写零偏移量并在末尾添加偏移量。 我建议您遵循w3c指南,因为它涵盖了针对不同时间节省用例的不同场景。 希望这会有所帮助