gpt4 book ai didi

java - Google Datastore - 将日期存储为 ISO 8601 字符串与 java.util.Date

转载 作者:行者123 更新时间:2023-12-01 18:31:59 24 4
gpt4 key购买 nike

我正在使用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 是数据存储区的 native 类型。

与符合 ISO 8601 的字符串相比,将日期/时间存储为 java.util.Date 是否有任何特殊的优点,或者是否完全相同。当我说优势时,我可能会考虑以下方面的差异......

  • 不等式查询
  • 存储大小
  • 读/写成本
  • 等等

最佳答案

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

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

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

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

  • 并且您始终使用 UTC 来表示全局时间戳(即符号 Z 的零偏移量)。

确认这种稳定性可能取决于应用程序,而 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) 读写成本:此项支持紧凑数据类型,例如 java.util.Date。但您还必须考虑到,即使在这种情况下,您迟早也必须在任何其他层(大多数在日志记录或表示层中)以人类可读的格式表示它。因此,对于与其他需要 java.util.Date 的专有应用程序进行数据交换,这种 native 类型是可以的,但对于日志记录目的或 XML 数据交换 ISO-8601 可能是更好的格式。

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

关于java - Google Datastore - 将日期存储为 ISO 8601 字符串与 java.util.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23773166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com