【问题标题】:Store date in MongoDB without considering the timezone在 MongoDB 中存储日期而不考虑时区
【发布时间】:2015-02-13 12:10:11
【问题描述】:

在不考虑时区的情况下,在 MongoDB 中存储日期的最佳方式是什么?

我试着用一个例子来解释这个问题:

意大利的Giuseppe在日期"December 15, 2014"创建了一个invoce,当系统存储这个日期时,在MongoDB中会存储"2014-12-14T23:00:00.000Z"

英国的 John 阅读了发票并将 "December 14, 2014" 视为发票日期。

显然这个信息是错误的,因为 Jhon 也应该看到 "December 15, 2014" 作为发票日期,我该如何解决这个问题?

【问题讨论】:

    标签: javascript mongodb date datetime timezone


    【解决方案1】:

    不应将整个日期放在Date 对象中。尽管有这个名字,Date 代表一个日期和一个时间。如果您正在使用的值表示整个日期,而不是该日期的特定时间,那么您应该以另一种格式存储该值。

    选项是:

    • YYYY-MM-DDYYYYMMDD 格式的字符串
    • 自某个参考点以来的整数天数。

    【讨论】:

    • 这是完全不正确的。 JavaScript 如何处理日期的实例化的表示正是我所展示的。这些术语不相等,它们代表本地时间或 UTC 时间,如图所示。实例化的参数比您作为有效选项提供的示例更多,因此这是错误的。
    • 当您将字符串传递给 Date 对象构造函数时,您对 JavaScript 的行为方式是正确的。我提倡 not 在这种情况下使用 Date 对象。
    • 字符串长度:字符 * 8 = "YYYYMMDD" = 64 位。 MongoDB 日期对象的长度 = 64 位...浪费了“YYYYMMDD”的精力,如果使用“YYYY-MM-DD”,则浪费了精力和空间......尽管某个参考点可以工作,但如果你这样做可能是值得的'被推送到内存中。
    • MattJohnson 的回答适用于这种情况:用户在纽约注册了一个应用程序。然后他搬到了加利福尼亚。如果我们使用 MongoDB 日期对象来存储他的出生日期值,我们应该处理使用用户位置(国家或 UTC 信息)数据来显示和评估应用程序中的正确日期值。否则,如果用户的 dob 值为“1972-01-01T00:00:00”,当应用程序在加利福尼亚运行时,dob 似乎为“1971-12-31T21:00:00”。所以存储日期有两种选择,1. 存储为字符串 2. 存储为 ISODate 对象,还存储注册用户的位置以显示正确的出生日期。
    • @Forbesmyester 贵公司是否会为您的每一笔费用收取费用? XD
    【解决方案2】:

    这意味着“你做错了”。长期以来,良好的数据库实践是以 UTC 或祖鲁时间格式存储日期。所以你应该做的是(至少在 JavaScript 表示法中)是这样的:

    var  myDate = new Date ("2014-12-15");
    

    并且您应该考虑到您输入的日期字符串已经从您的本地时间转换为 UTC 时间,或者无论如何只是输入您的对象,因为这是驱动程序将执行的操作。

    JavaScript 有有趣的方式来解释提供的日期“字符串”。比如:

    var  myDate = new Date ("2014/12/15");
    

    实际上在您的“本地”时区向您的应用程序提供了一个日期对象。在大多数情况下,可能不是您真正想要的。

    最佳实践。怎么强调都不过分。 “通用时间常数”是您存储日期数据的唯一方式。否则你做错了。

    【讨论】:

    • 尊敬的 - 我不能再不同意你了。 UTC 对于没有时间分量的整个日期是没有意义的。这是一个常见的错误来源,当一个营业日期被假定为“午夜”时——当转换为 UTC 或其他时区时,可能会更改日期。整个日期应该存储为整个日期,仅此而已。此外 - 即使有时间组件,存储为 UTC 并不总是最佳实践。这对于记录过去/现在的数据来说是不错的,但在调度 未来 数据时就不行了,因为时区规则可能会改变!
    • 另外,(nitpick) - UTC 代表“协调世界时”,而不是“世界时常数”。请参阅Wikipedia 了解字符乱序的原因。
    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2013-09-01
    • 2014-10-24
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多