【问题标题】:Save TimeZone with Date in mongodb在 mongodb 中保存带日期的时区
【发布时间】:2016-11-09 08:34:09
【问题描述】:

我的文档类中有 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 代表什么?

【问题讨论】:

  • 警告:官方文档中 Anirudh 和 Yonatan 的解决方案旨在查询本地时间的数据库,这很骇人听闻,可能是也可能不是您的用例。请注意,看起来 Javascript Date 对象实际上并不存储时区信息。您没有说明是否需要根据当地时间执行查询。我的用例可以查询 UTC,我只想使用时区访问完整的原始日期。在这种情况下,最简单的方法是存储两个字段:用于 UTC 查询的 ISODate,一个 ISO-8601 字符串。

标签: java mongodb java.util.date


【解决方案1】:

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

请通过此链接。他们给出了一个关于如何使用 JavaScript 对本地时间数据建模的示例。

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

【讨论】:

    【解决方案2】:

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

    如果您非常想存储带有偏移量的时区,您可能必须在 db 中将其作为单独的字符串处理,但它不能与 MongoDB 的日期字段一起使用。

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

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

    【讨论】:

    • 保存、加载和显示是不同的东西。假设时间戳已在印度记录,以 UTC 时间存储,现在显示在欧洲。在这种情况下,您不想将 UTC 时间转换为欧洲时间,但您想查看原始印度时间。但你是对的,你需要将时区存储在一个单独的字段中。 Example here.
    • @Matthias 当您想在数据库中存储特定时区而不是 UTC 时,这是一个很好的场景。因此,当您看到原始数据时,它始终处于所需的时区。但至于显示数据,应该重新转换为 UTC 并正确应用时区
    • 仅存储 UTC 的问题是,您会丢失原始时区信息,这使得在特定情况下很难重新使用时间戳。在用户当前时区中显示的时区可能与记录数据的时区不同。
    【解决方案3】:

    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 ) );
    

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 2016-03-12
      • 2016-11-18
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2022-01-05
      相关资源
      最近更新 更多