2

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

我可以看到很多选项:

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

问题:

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

1 回答 1

3

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

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

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

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

如果您要存储多头并且您的客户需要考虑日期时间,我想说唯一需要注意的陷阱涉及处理时区。

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

于 2013-10-11T05:18:45.167 回答