题
有没有一种明智的方法可以按天对长 UTC 日期进行分组?
我会将它们修改为 86400,但这没有考虑闰秒。
有没有人有任何其他想法,我正在使用 java,所以我可以将它们解析为日期对象,但我有点担心使用日期类的性能开销。
还有比比较 Date 对象的年月日部分更有效的方法吗?
解决方案
请问您的源数据的绝对的包括闰秒开始吗?某些API做,有些不 - 乔达时间(我建议你在内置的日期/时间的API)的不使用闰秒时,例如。 Java的日期和时间的API“有时”事 - 他们支持60和61的“第二次在分”值,但支持取决于操作系统(见下文)。如果你有一些很好的样本值,我会检查第一,如果我是你。显然只是划分的,而不是什么都简单了。
如果您的不的需要创建Date
对象(或乔达DateTime
)我想它的基准做任何事情之前。你可能会发现,业绩其实是完全足够了。有没有在浪费时间优化的东西是好的为您的数据是没有意义的。当然,你需要决定你需要支持数据的大小,以及如何快速它需要先:)
即使对于闰秒的java.util.Date
支撑有些不确定的。从的文档:
虽然Date类旨在 反映协调世界时 (UTC),它可能无法做到如此准确, 这取决于主机环境 Java虚拟机。几乎所有的 现代操作系统都假定1 天= 24×60×60 = 86400秒 所有案件。在UTC,然而一次,约 每一年或两年有一个额外的 第二,称为“闰秒”。该 闰秒总是被添加作为 一天的最后一秒,永远都在 12月31日或6月30日。例如, 1995年的最后一分钟是 61秒长,因为增加了 闰秒。大多数计算机时钟 不够准确,以便能够 反映闰秒的差别。
其他提示
我将由86400 MOD他们,但不采取闰秒考虑....
我敢肯定,这将是罚款。对于Date
真正的API文档不应该包括有关闰秒什么,因为事实是,它模拟一个标准的Unix时间股票不包括闰秒在它的价值。
它的作用,而不是是有一个第59秒,通过在一个飞跃的开始第二设定值股票背面由1秒(如在过去后的链接描述)持续2秒钟持续。
因此,你可以假设你从Date.getTime()
获得价值仅由86400-第二天起来。如果你真的需要知道是否的特别的一天有一个闰秒,都存在几个可用的表在互联网上(目前仅有1972年以来月23-24日,在此之前,计算机日期很少带他们到无论如何帐户)。
HIH
温斯顿
太长了;博士
Instant.ofEpochSecond( 1_493_367_302L ) // Convert a count of whole seconds from epoch of 1970 into a date-time value in UTC.
.atZone( ZoneId.of( "Pacific/Auckland" ) ) // Adjust into the time zone as a context for determining a date.
.toLocalDate() // Extract a date-only value by which we can sort/collect/organize our date-time values.
时区
这 java.util.Date
类代表 UTC 时间轴上的时刻。因此,询问它的日期会得到一个仅在 UTC 中有意义的日期。同一时刻可能是魁北克的较早日期或新西兰奥克兰的较晚日期。
时区对于确定日期至关重要,而您的问题忽略了这个问题。
使用java.time
这 java.util.Date
class 是麻烦的旧日期时间类的一部分,这些类现在已经被遗留下来,被 java.time 类取代。
至于闰秒,正如其他答案所建议的那样,大多数纪元计数来源都这样做 不是 计算闰秒。因此请验证您的来源。
如果您有从纪元开始的整秒数 1970-01-01T00:00:00
, ,然后使用静态方法创建一个 Instant
目的。
Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;
instant.toString():04/28/2017 08:15:02
指定一个时区来创建我们可以确定日期的上下文。对于任何特定时刻,世界各地的日期因地区而异。
指定一个 正确的时区名称 格式为 continent/region
, , 例如 America/Montreal
, Africa/Casablanca
, , 或者 Pacific/Auckland
. 。切勿使用 3-4 个字母的缩写,例如 EST
或者 IST
像他们那样 不是 真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString():2017-04-28T01:15:02-07:00[美国/洛杉矶]
与这些一堆 ZonedDateDate
对象,您可以按日期进行比较。您可以提取一个 LocalDate
目的。这 LocalDate
类表示仅日期值,没有时间和时区。
LocalDate ld = zdt.toLocalDate();
ld.toString():2017-04-28
所以你可以做一个 Map
和 LocalDate
作为钥匙和 List
或者 Set
的 ZonedDateTime
对象作为值。通过现代 lambda 语法,您可以使用 Streams 来执行该映射。
关于 java.time
这 java.time 框架内置于 Java 8 及更高版本中。这些课程取代了麻烦的旧课程 遗产 日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
这 乔达时间 项目,现在在 维护模式, ,建议迁移到 java.time 类。
要了解更多信息,请参阅 甲骨文教程. 。并在 Stack Overflow 上搜索许多示例和解释。规格为 JSR 310.
从哪里获取 java.time 类?
- Java SE 8, Java SE 9, , 然后
- 内置。
- 具有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些小功能和修复。
- Java SE 6 和 Java SE 7
- 许多 java.time 功能都向后移植到 Java 6 和 7 三十后端口.
- 安卓
- 这 三十ABP 项目适应 三十后端口 (如上所述)专门针对 Android。
- 看 如何使用 ThreeTenABP....
这 三十额外 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, , 和 更多的.