有没有一种合理的方法可以按天对长 UTC 日期进行分组?
我会将它们修改为 86400,但这不考虑闰秒。
有没有人有任何其他想法,我正在使用 java,所以我可以将它们解析为日期对象,但我有点担心使用日期类的性能开销。
还有比比较 Date 对象的年月日部分更有效的方法吗?
您的源数据是否肯定包含闰秒?有些 API 会,有些则不会 - 例如,Joda Time(我建议使用内置日期/时间 API)不使用闰秒。Java 日期和时间 API“有时”会这样做——它们支持 60 和 61 作为“分钟秒数”的值,但支持取决于操作系统(见下文)。如果你有一些好的样本值,如果我是你,我会先检查一下。显然,只是划分比其他任何事情都简单。
如果您确实需要创建Date
对象(或DateTime
在 Joda 中),我会在做任何其他事情之前对其进行基准测试。您可能会发现性能实际上是完全足够的。浪费时间优化适合您的数据的东西是没有意义的。当然,您需要确定需要支持的数据大小,以及首先需要多快 :)
甚至java.util.Date
对闰秒的支持也有些不确定。从文档:
尽管 Date 类旨在反映协调世界时 (UTC),但它可能并不完全如此,这取决于 Java 虚拟机的主机环境。几乎所有现代操作系统都假定在所有情况下 1 天 = 24 × 60 × 60 = 86400 秒。然而,在 UTC 中,大约每隔一两年就会多出一秒,称为“闰秒”。闰秒总是作为一天的最后一秒添加,并且总是在 12 月 31 日或 6 月 30 日。例如,由于添加了闰秒,1995 年的最后一分钟是 61 秒。大多数计算机时钟不够准确,无法反映闰秒的区别。
有一篇关于 Java 混乱和闰秒的相当不错的博客文章,您可能也想阅读。
我会将它们修改为 86400 但这并不考虑闰秒......
我很确定那会很好。API 文档Date
真的不应该包含任何关于闰秒的内容,因为事实上它模拟了一个标准的 Unix 时间记录器,它的值中不包含闰秒。相反,它的作用是通过在闰秒开始时将代码值设置回 1 秒(如上一篇文章中的链接所述),使第 59 秒持续两秒。
因此,您可以假设您从Date.getTime()
IS 获得的值仅由 86400 秒组成。如果你真的需要知道某一天是否有闰秒,互联网上有几张表格(自 1972 年以来只有 23 到 24 天,而在此之前的计算机日期很少考虑它们)。
HIH
温斯顿