【问题标题】:Determining if a time stamp is an exact hour确定时间戳是否为精确小时
【发布时间】:2013-07-14 06:02:31
【问题描述】:

我需要确定时间戳是否是精确的小时(即它表示没有分钟、秒或毫秒分量的时间) - 仅使用原语。该代码每秒被调用数百次,我不想要Calendar 或其他对象的开销。

我已经尝试过了,但舍入错误会导致比较失败。

 float hours = (time / 3600000f);
 boolean isExactHour = hours == (int)hours;

例如,如果时间 = 1373763600470,小时 = 381601.03125。该时间戳表示今天格林威治标准时间 01:00:00:000,小时数应为 381601。

有什么想法可以快速简单地做到这一点吗?谢谢!

[编辑]

这似乎比乍一看更复杂(什么时候不是?:)

为了清楚起见,我不关心时区,也不关心闰秒。时间戳由返回前一个午夜的方法生成 - 即今天的 2013 年 7 月 13 日 00:00:00:000。然后,我正在计算一个 long 数组中的任何时间戳,它始终是这个初始时间戳加上/减去 5 分钟的精确倍数。我的目标是确定给定的邮票是否是“小时之内”。我可能会遇到 5 分钟的倍数与年底重叠的极端情况,但我可以忍受这些。

【问题讨论】:

  • “有什么快速简单的方法吗?” 请互联网上的陌生人“为你做”?哦,你已经知道了..
  • 你确定 1373763600470 代表 01:00:00:000 而不是 01:00:00:470 吗?
  • Erm,您为什么要尝试将float 用于exact 的任何内容?我认为您正在寻找modulo operation
  • @Simon:你想要哪个时区的确切时间?时间戳基于 UTC,而不是本地时间。
  • 有些时区与 UTC 的偏移量不是整数小时。

标签: java time utc


【解决方案1】:
(time % 36000000) == 0

这肯定很明显吗?

编辑

为了获得准确性 w.r.t.闰秒,假设闰秒的查找表按 1970 年以来的年份索引,类似于:

((time-leapSeconds[(int)(time/(1000*60*60*24*365.2425))-1970]*1000) % 3600000) == 0

需要这种精确度的程序员还应该看到下面的 Einar 的所有 cmets。

【讨论】:

  • 嗬嗬嗬嗬嗬嗬嗬嗬。谢谢!键盘和椅子之间的时间过长。
  • 闰秒怎么样?我会使用日历并检查毫秒、秒和分钟字段是否为 0。
  • 我不认为这会给你正确的答案。不考虑闰秒的概念。它们大约是 +1 秒/年,并且由于时间戳是自 1970 年 1 月 1 日 00:00:00 以来的秒数,您可能会关闭大约 30-40 秒。
  • @jackrabbit OP 明确指出(1)“仅基元”(2)非常高性能和(3)“没有日历对象”。
  • @EJP 您可能希望将此添加到您的答案中:要使表格保持最新,您还需要通过咨询 [Bureau International de l'Heure (BIH)] 来跟踪即将到来的闰秒[1] 自他们提前六个月宣布闰秒以来,每年至少两次。 [1]:hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 2011-09-04
  • 2016-07-30
  • 2017-01-11
  • 2014-09-20
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多