我正在创建一个自定义数据类型,该数据类型需要以高效且正确的方式存储一组精确的时间戳(精确到毫秒级(。我对时间戳处理的复杂性并不是特别熟悉,所以我想我会在这里寻求一些明智的建议。
我可以看到很多选项:
- 为每个时间戳存储一个 Joda
Instant
。 - 为每个时间戳存储一个 Joda
DateTime
。 - 为数据类型存储一次 Joda
DateTime
对象,并且相对于主时间戳具有long
偏移量DateTime
- 将每个时间戳表示为固定点的
long
偏移量(例如 1970-01-01T00:00:00Z 的 Unix 纪元( - .....其他组合.....
问题:
- 存储时间戳序列的最佳方法是什么?
- 关键的权衡是什么?
- 有什么需要注意的陷阱吗?
您的每个存储选项都有意义,很高兴看到您的所有选项都带有实际时刻,而不是本地日期时间(例如,没有时区(。
您的自定义类实际上将由其接口定义,因此如果您选择存储长整型(纪元偏移量(,您可以随时提供接口方法来从序列中获取值(我假设其他东西,如"增量" - 或间隔,持续时间或周期在Joda语言中(在人类可读的日期时间和周期中,如果您愿意的话。
当你问了一些涉及权衡的问题时,我可以提供以下内容:
- 存储长整型序列最节省空间。
- Long 并不像您想象的那么糟糕,因为如果您的接口方法想要返回 datetime,您只需将 long 传递给 DateTime 构造函数。
- Instants 是 long 的薄包装器,如果您需要向它们添加持续时间或从 Instant 计算持续时间,它提供了方便的方法;您的代码可能看起来比您对 long 进行自己的数学运算然后围绕它们构造 DateTime 或 Period 或 Duration 更好一些。
- 如果您没有过多的存储要求,并且实际日期和时间对自定义数据类型的客户端很重要,则 DateTimes 非常有用。 您的用户是否关心时间戳是否在美国/洛杉矶时区的 10 月 10 日 16:22? 还是时间戳之间的持续时间很重要?
- 存储日期时间或即时时间以及偏移量数组看起来像是一个混乱的实现,因为有两个概念在起作用。 我认为仅存储单个时刻/日期时间序列,而不是混合持续时间,更有意义。 如果需要使用持续时间,只需在接口方法中计算它们即可。
我想说的是,唯一需要注意的陷阱是处理时区,如果你正在存储多头,而你的客户需要在日期时间里思考。
在权衡方面,我只真正看到 longs,原始,节省空间,我猜 DateTimes 是对象并且发生的所有堆分配和释放的时间微乎其微。 但同样,除非你受到严重的内存限制,否则我会说最好的办法是存储日期时间。 Joda-Time可以为您完成所有时区管理。 解析和格式化例程简单且线程安全。 有很多方便的方法。 而且您不必自己从日期时间转换为多头。 对我来说,存储多头只是感觉过早的优化。 奇怪的是,FWIW,我可能会在 Python 中这样做,因为 Python 的日期时间对象是幼稚的,而不是时区感知的,默认情况下! Jada-Time 使恕我直言,它是即时和本地日期时间之间非常好且易于理解的区别,因此我相信,在任何地方坚持使用日期时间将是你最好的选择。