有没有一种明智的方法可以按天对长 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秒长,因为增加了   闰秒。大多数计算机时钟   不够准确,以便能够   反映闰秒的差别。

有一个相当不错的博客文章有关Java和闰秒的烂摊子,你可能需要阅读了。

其他提示

  

我将由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

所以你可以做一个 MapLocalDate 作为钥匙和 List 或者 SetZonedDateTime 对象作为值。通过现代 lambda 语法,您可以使用 Streams 来执行该映射。


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些课程取代了麻烦的旧课程 遗产 日期时间类,例如 java.util.Date, Calendar, & SimpleDateFormat.

乔达时间 项目,现在在 维护模式, ,建议迁移到 java.time 类。

要了解更多信息,请参阅 甲骨文教程. 。并在 Stack Overflow 上搜索许多示例和解释。规格为 JSR 310.

从哪里获取 java.time 类?

三十额外 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval, YearWeek, YearQuarter, , 和 更多的.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top