如何计算给定ZonedDateTime的下一分钟和下一个5分钟间隔



我有一个ZonedDatetime的实例。

ZonedDateTime.now(ZoneId.of("America/New_York"))

我基本上需要一个函数,它将接受一个ZonedDateTime的实例,并返回下一个1分钟和5分钟的值。

如果当前时间是:

2021-10-24T19:46:10.649817

下一分钟是19:47:00,下一分钟是19:50:00

下一个5分钟间隔总是这样:

1:00
1:05
1:10
1:15
1:20
1:25
...
1:50
1:55
2:00

。下一个5分钟的间隔不是基于从现在开始的5分钟,而是基于从一个小时的开始开始的下一个5分钟。对于以后的下一个1分钟间隔也是如此。

def nextIntervals(zdt: ZonedDateTime): (ZonedDateTime, ZonedDateTime) = {
???
}

这样做非常简单,无需硬编码这些值。不幸的是,我不熟悉scala,所以我会给你一些伪代码,我相信你能很容易地翻译它。

nextIntervals(zdt) {
timestamp = zdt.toUnixTimestamp();
return [
new ZonedDateTime(timestamp + (60 - timestamp % 60)),
new ZonedDateTime(timestamp + (300 - timestamp % 300))
]
}

上面的代码假设ZonedDateTime可以通过给它一个unix时间戳(以秒为单位)来实例化。还可以将其转换为unix时间戳。

这个想法非常简单:模量的剩余部分将是自最后一个所需时间段(在您的例子中是1分钟或5分钟)以来所经过的时间。把它从周期本身拿走你就得到了到下一个周期的剩余时间。把它加到当前时间,你就有了确切的日期时间。

编辑:

这是一个工作的javascript示例

function nextIntervals(date) {
let t = date.getTime();
return [
60e3,
300e3,
].map(i => new Date(t + i - t % i));
}
console.log(nextIntervals(new Date));

您可以使用以下函数来满足您的需求:

  1. ZonedDateTime#plusMinutes
  2. ZonedDateTime#minusMinutes
  3. ZonedDateTime#truncatedTo

演示:

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"));
ZonedDateTime nextMinute = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);
ZonedDateTime nextMultipleOfFiveMin = now.truncatedTo(ChronoUnit.MINUTES)
.minusMinutes(now.getMinute() % 5)
.plusMinutes(5);
System.out.println(now);
System.out.println(nextMinute);
System.out.println(nextMultipleOfFiveMin);
}
}

示例运行的输出:

2021-10-25T16:59:22.662943-04:00[America/New_York]
2021-10-25T17:00-04:00[America/New_York]
2021-10-25T17:00-04:00[America/New_York]

另一个示例运行一段时间后的输出:

2021-10-25T17:05:09.596952-04:00[America/New_York]
2021-10-25T17:06-04:00[America/New_York]
2021-10-25T17:10-04:00[America/New_York]
<<p>

在线演示/kbd>从Trail: Date Time了解更多关于现代Date-Time API的信息。检查这个答案和这个答案,了解如何使用java.timeAPI与JDBC。

注意:java.util日期-时间API和它们的格式化APISimpleDateFormat已经过时并且容易出错。建议完全停止使用它们,切换到现代的Date-Time API*


*如果你正在为一个Android项目工作,你的Android API级别仍然不兼容Java-8,检查Java 8+可用的API。注意Android 8.0 Oreo已经提供了对java.time的支持。

我们确实需要一些手工编码的数学来处理5分钟间隔的情况。请原谅我的Java语法

ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("Now: " + now);
// Truncate to the previous 5 minutes
ZonedDateTime zdt = now.truncatedTo(ChronoUnit.MINUTES);
zdt = zdt.withMinute(zdt.getMinute() / 5 * 5);
for (int i = 0; i <= 12; i++) {
zdt = zdt.plusMinutes(5);
System.out.println(zdt);
}

示例输出:

Now: 2021-10-25T15:23:31.357567-04:00[America/New_York]
2021-10-25T15:25-04:00[America/New_York]
2021-10-25T15:30-04:00[America/New_York]
2021-10-25T15:35-04:00[America/New_York]
2021-10-25T15:40-04:00[America/New_York]
2021-10-25T15:45-04:00[America/New_York]
2021-10-25T15:50-04:00[America/New_York]
2021-10-25T15:55-04:00[America/New_York]
2021-10-25T16:00-04:00[America/New_York]
2021-10-25T16:05-04:00[America/New_York]
2021-10-25T16:10-04:00[America/New_York]
2021-10-25T16:15-04:00[America/New_York]
2021-10-25T16:20-04:00[America/New_York]
2021-10-25T16:25-04:00[America/New_York]

截断为5分钟的整数倍的技巧是除以5,得到一个整数并去掉任何余数,然后再乘以5。

1分钟的间隔是类似的,只是简单一点:我们不需要自己做任何数学运算,java。时间会照顾好一切。

最新更新