java - 使用时间戳和偏移量进行时间处理

标签 java datetime timezone jodatime

我正在创建一个自定义数据类型,它需要以高效且正确的方式存储一组精确时间戳(精确到毫秒)。我不太熟悉时间戳处理的复杂性,因此我想在这里寻求一些明智的建议。

我可以看到很多选项:

  • 为每个时间戳存储 Joda Instant
  • 为每个时间戳存储 Joda DateTime
  • 为该数据类型存储一次 Joda DateTime 对象,并为所有其他时间戳相对于主 DateTime 提供一个 long 偏移量>
  • 将每个时间戳表示为固定点的长偏移量(例如 Unix 纪元 1970-01-01T00:00:00Z)
  • ......其他组合......

问题:

  • 存储时间戳序列的最佳方式是什么?
  • 关键的权衡是什么?
  • 有什么需要注意的陷阱吗?

最佳答案

您的每个存储选项都很有意义,并且很高兴看到您的所有选项都与实际时刻有关,而不是本地日期时间(例如,没有时区)。

您的自定义类实际上是由其接口(interface)定义的,因此,如果您选择存储长整型(纪元偏移量),您始终可以提供接口(interface)方法来从序列中获取值(我假设其他如果您愿意,可以使用人类可读的日期时间和周期中的“增量”(或 Joda 语言中的间隔、持续时间或周期)之类的内容。

当您提出一些涉及权衡的问题时,我可以提供以下内容:

  • 存储长整型序列是最节省空间的。
  • 长整型并不像您想象的那么糟糕,因为如果您的接口(interface)方法想要返回日期时间,您只需将长整型传递给 DateTime 构造函数即可。
  • 瞬时是长数的薄包装,如果您需要向它们添加持续时间或从瞬时计算持续时间,则可以提供便捷的方法;您的代码可能看起来比您自己对长整型进行数学计算然后围绕它们构建日期时间或周期或持续时间要好一些。
  • 如果您没有过多的存储要求,并且实际日期和时间对自定义数据类型的客户端很重要,则日期时间非常有用。您的用户会关心时间戳是美国/洛杉矶时区 10 月 10 日 16:22 吗?或者时间戳之间的持续时间才是最重要的?
  • 存储日期时间或即时值加上偏移量数组看起来是一个困惑的实现,因为有两个概念在起作用。我认为仅存储单个瞬时/日期时间序列,而不混合持续时间,更有意义。如果您需要使用持续时间,只需在接口(interface)方法中计算它们即可。

我想说,如果您存储长整型数据并且您的客户需要考虑日期时间,那么唯一需要注意的陷阱涉及处理时区。

就权衡而言,我只真正看到 long 是原始的,可以节省空间,而且我猜想因为 DateTimes 是对象并且发生了所有堆分配和释放,所以时间很少。但同样,除非您的内存严重受限,否则我会说最好的办法是存储日期时间。 Joda-Time可以为您完成所有时区管理。解析和格式化例程非常简单且线程安全。有很多方便的方法。而且您不必自己进行任何从日期时间到长整型的转换。对我来说,存储多头只是一种过早的优化。奇怪的是,FWIW,我可能会在 Python 中这样做,因为默认情况下,Python 的日期时间对象很幼稚,而不是时区感知! Jada-Time 使恕我直言,即时和本地日期时间之间的区别非常好且易于理解,因此我相信,在任何地方坚持使用日期时间将是您最好的选择。

关于java - 使用时间戳和偏移量进行时间处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19310492/

相关文章:

java - Zulu 和 Offset 的日期时间格式

java - 如何设置java.util.Date的时区?

java - 将 Grails 应用程序与非 Grails liferay 一起部署?

Java 8 streaming 和 sql like join

WPF4 DatePicker - 添加时间

python - 考虑到去年的第一天,今年的第一周

continuous-integration - 如何更改 Team City 5.1 上的时区?

ruby-on-rails - 在 ruby​​ 中以任意 gmt 偏移量解析时间

java - 使用 hprof 分析 WebSphere 的 CPU SAMPLES 输出

java - 资源名称中的 spring-way 句柄斜线