【问题标题】:Google Datastore - Storing dates as ISO 8601 Strings vs java.util.DateGoogle Datastore - 将日期存储为 ISO 8601 字符串与 java.util.Date
【发布时间】:2014-05-21 02:48:28
【问题描述】:

我正在使用 Joda-Time,我注意到 DateTime 在 Google App Engine Datastore for Java 中存储为 java.util.Date,而 LocalDateTime 存储为符合 ISO 8601 的字符串。

http://code.google.com/p/objectify-appengine/source/browse/src/com/googlecode/objectify/impl/translate/opt/joda/?r=2d48a85eae3a679c0dc0d01631de99f3b4775b29

我知道 java.util.Date 是 Datastore 的原生类型。

与符合 ISO 8601 的字符串相比,将日期/时间存储为 java.util.Date 是否有任何特别的优势,或者是否都一样。当我说优势时,我可能会考虑...

  • 不等式查询
  • 存储大小
  • 读/写开销

【问题讨论】:

    标签: java google-app-engine jodatime objectify iso8601


    【解决方案1】:

    接受的答案没有错,但我想添加额外的细节,以提供更平衡的观点。

    a) 稳定查询:只要您断言,ISO-8601 就是稳定的

    • 您只使用一种日期格式进行存储(ISO 定义了三种:日历日期、序数日期和星期日期)

    • 并且您始终对时间部分使用一种精度(例如始终以毫秒为单位)

    • 并且对于全局时间戳(即符号 Z 的零偏移),您始终使用 UTC。

    确认这种稳定性可能取决于应用程序,而java.util.Date 不需要同样的注意。

    b) 精度:ISO-8601 可以表达超过毫秒的精度,而 java.util.Date 和 Joda-Time 在这里受到限制。如果您以后可能会想到其他新的时间库,例如 Java 8 中的 JSR-310 或我自己的提供纳秒精度的时间库,则尤其如此。然后,您将遇到所有 JDBC 类型、java.util.Date 和数据库列(只要它们不是 CHAR 或 VARCHAR)的精度问题。

    一个显着的例子是 JDBC 类型的java.sql.Time,它的精度被限制为秒,而不是更好。这与提供纳秒的新 Java8 类型 java.time.LocalTime 形成鲜明对比。更糟糕的是:这方面也与应用层中的 Joda-Time 和 java.util.Date 相关。

    出于学术目的:闰秒只能以 ISO-8601 格式存储,不能以 java.util.Date 或类似格式存储。

    c) 存储大小:当然,java.util.Date 有一个更紧凑的表示,但是我不得不说现在磁盘空间很便宜,所以这不是一个需要担心的项目所以很多。

    d) Read-Write-costs:此项支持紧凑型数据类型,例如java.util.Date。但是您还必须考虑,即使在这种情况下,您迟早必须在任何其他层(大多数在日志记录或表示层)中以人类可读的格式表示它。因此,对于与期望java.util.Date 的其他专有应用程序进行数据交换,这种 native 类型是可以的,但对于 日志记录或 XML 数据交换,ISO-8601 可能是更好的格式.

    如果您真的非常关心性能成本,您甚至可以考虑使用数字类型(长 - 64 位)来避免不必要的对象创建(在极端情况下)造成的垃圾负担。请记住:java.util.Date 只是一个 long 的包装。

    【讨论】:

      【解决方案2】:

      java.util.Date 的优势:稳定的查询(不等式和等式)、存储大小以及与具有本地日期表示的其他 GAE 语言的互操作性。

      【讨论】:

      • 什么是“稳定查询”?使用 ISO 8601 字符串不等式查询应该可以正常工作,对吧?
      • ISO8601 日期时间格式对时区进行编码,因此几个不同的字符串可以表示同一时间点。 Millis since epoch (java.util.Date) 是明确的。
      猜你喜欢
      • 2011-01-13
      • 2019-02-27
      • 1970-01-01
      • 2021-01-17
      • 2016-12-14
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多