【问题标题】:Get 12 hours before and after current time获取当前时间前后 12 小时
【发布时间】:2021-04-14 06:30:45
【问题描述】:

我在 Java 中处理时间时遇到问题。比较现在和前后12小时

的时间,我真的不明白如何有效解决

我从 API 获得一组节目的开始时间,然后将该开始时间与 LocalTime.now() 进行比较。它看起来像这样:

SimpleDateFormat sdt = new SimpleDateFormat("HH:mm:ss");
String temp = sdt.format(Local.time(now));
LocalTime secondTime = LocalTime.parse(parts1[0]);
LocalTime firstTime = LocalTime.parse(temp);
int diff = (int) ((MINUTES.between(firstDay, secondDay) + 1440) % 1440);
if(diff <= 720){
    return true;
}

我的想法是,如果两次之间的差异小于 720 分钟(12 小时),我应该得到正确的输出。这适用于现在之前的 12 小时。我想我可能需要交换.between 的参数,才能获得另一半。这完全是错误的(如果现在的时间是 15:00:00,它将接受所有时间,直到同一天的 22:00:00)。这只是比较两次的一种非常糟糕的方式吗?还是只是我的数学对我正在尝试做的事情缺乏理解?

谢谢

【问题讨论】:

  • 您为什么不直接取开始日期并从中添加/减去 12 小时,以获得您想要与当前时间进行比较的范围?
  • 你不能用LocalTime#minusHours吗?
  • 你应该使用DateTimeFormatter类而不是SimpleDateFormat类。
  • 嗯,其实大牛说的也是我的意思。只需使用适当的方法来增加和减少小时数。
  • @OleV.V 对不起。我遇到的问题是我从 API 获得了节目的开始时间和日期。我想看看那个时间和日期是否发生在从现在到现在之后的 12 小时之间。一个更明确的问题可能是如何知道时间和日期是否在 24 小时间隔之间?希望这能让我的问题更清楚

标签: java time java-time


【解决方案1】:

使用“新”(不是那么新)Java 8 时间 API:

Instant now = Instant.now();
Instant hoursAfter = now.plus(12, ChronoUnit.HOURS);
Instant hoursBefore = now.minus(12, ChronoUnit.HOURS);

【讨论】:

  • 我可以在使用 Instant 时使用类似 between 的东西吗?我需要看看这些瞬间之间是否存在时间
  • 使用适当的逻辑对Instant.isAfter 和Instant.isBefore 进行两次调用。如果您使用的是较早的 API 版本,则可能必须使用 compareTo
  • 谢谢你,我要找的东西!
  • @forsb 请注意,“即时”表示减去/添加 12*60*60 秒。这意味着您可能会发现“2 点钟 + 12 小时”变成了“晚上 3 点钟”。夏令时等等。如果你想把下午 2 点变成晚上 2 点,即使这意味着由于 DST 开关只晚了 11 或 13 小时,使用例如LocalDateTime 和 .addHours(12) 代替。
【解决方案2】:

首先,对java.time.LocalTime 进行这种操作是行不通的!或者至少只有当时间是“12:00:00”时……

这是因为当您从任何其他时间添加/减去 12 小时时,您将出现上溢/下溢。

所以你的出发点应该是选择java.time.LocalDateTime(至少,虽然我会选择java.time.Instant)。现在您可以处理上溢/下溢,因为增加或减少 12 小时后您将获得另一天。

this anwswer 中显示了它的工作原理:LocalDateTime 允许与Instant 几乎相同的操作。

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多