【问题标题】:Time handling with timestamp and offset带有时间戳和偏移量的时间处理
【发布时间】:2013-10-11 04:53:34
【问题描述】:

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

我可以看到很多选项:

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

问题:

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

【问题讨论】:

  • 您的自定义类是否定义了间隔?如果是这样,您可能需要考虑只使用 Joda Time Interval class

标签: java datetime timezone jodatime


【解决方案1】:

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

您的自定义类将真正由其接口定义,因此如果您选择存储 long(纪元偏移),您始终可以提供接口方法来从序列中获取值(我假设其他如果您愿意,可以在人类可读的日期时间和周期中显示诸如“deltas”之类的东西 - 或 Joda-speak 中的间隔、持续时间或周期。

正如您提出的许多问题,涉及权衡,以下是我可以提供的:

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

我想说,如果您要存储多头数据并且您的客户需要考虑日期时间,那么需要注意的唯一缺陷是处理时区。

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

【讨论】:

  • 感谢您的精彩回答 - 它既证实了我的一些怀疑,也教会了我一些新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多