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

时间:2013-10-11 04:53:35

标签: java datetime timezone jodatime

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

我可以看到很多选择:

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

问题:

  • 存储一系列时间戳的最佳方法是什么?
  • 有哪些关键权衡?
  • 需要注意的任何陷阱?

1 个答案:

答案 0 :(得分:3)

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

您的自定义类实际上将由其界面定义,因此如果您选择存储 long(epoch偏移),您始终可以提供接口方法以从序列中获取值(我假设其他诸如“增量”之类的东西 - 或Joda-speak中的间隔,持续时间或句号​​),如果您愿意,可以在人类可读的日期和时间段内使用。

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

  • 存储一系列长整数是最节省空间的。
  • Longs并不像你想象的那么糟糕,因为如果你的接口方法想要返回日期时间,你只需将long传递给DateTime构造函数。
  • 如果您需要为它们添加持续时间或从瞬间计算持续时间,则Instants是long上的瘦包装并提供便利方法;你的代码可能看起来比你在longs上做自己的数学好一点,然后在它们周围构建一个DateTime或Period或Duration。
  • 如果您没有过多的存储要求,并且实际日期和时间对您的自定义数据类型的客户端很重要,则日期时间很长。您的用户是否会关注美国/洛杉矶时区10月10日16:22的时间戳?或者时间戳之间的持续时间是否重要?
  • 存储日期时间或瞬间加上一组偏移看起来像一个混乱的实现,因为有两个概念在起作用。我认为只存储一个时刻/日期时间序列,而不是在持续时间内混合,更有意义。如果您需要使用持续时间,只需在界面方法中计算它们。

我想说,如果你要存储多头而你的客户需要在日期时间进行思考,那么需要注意的唯一陷阱涉及处理时区。

在权衡方面,我只是真正看到那些长篇,是原始的,节省空间,而且我会猜到自DateTimes是对象以来的微不足道的时间,并且发生了所有堆分配和释放。但同样,除非你受到严重的内存限制,否则我会说最好的办法就是存储DateTimes。 Joda-Time可以为您完成所有时区管理。解析和格式化例程简单且线程安全。有很多方便的方法。而且您不必将自己的日期转换为多头。存储多头只觉得对我来说过早的优化。奇怪的是,FWIW,我可能会在Python中这样做,因为Python的datetime对象是天真的,而不是时区感知,默认情况下! Jada-Time使得IMHO在Instants和Local DateTimes之间的区别非常好,易于理解,所以我相信,坚持使用DateTimes将是最好的选择。