如何在给定 ZonedDateTime 的情况下计算下一分钟和接下来的 5 分钟间隔
How to calculate the next minute and next 5 minute intevals given a ZonedDateTime
我有一个 ZonedDatetime 实例。
ZonedDateTime.now(ZoneId.of("America/New_York"))
我基本上需要一个函数,它将采用 ZonedDateTime 的实例和 return 接下来的 1 分钟和 5 分钟值。
所以如果当前时间是:
2021-10-24T19:46:10.649817
下一分钟将是 19:47:00
,接下来的 5 分钟将是 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));
您可以使用以下功能来满足您的要求:
演示:
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]
从 Trail: Date Time. Check this answer and this answer 了解有关现代日期时间 API 的更多信息,以了解如何将 java.time
API 与 JDBC 一起使用.
注意: java.util
日期时间 API 及其格式 API、SimpleDateFormat
已过时且错误-易于。建议完全停止使用它们并切换到 modern Date-Time API*.
* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for 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.time 搞定了。
我有一个 ZonedDatetime 实例。
ZonedDateTime.now(ZoneId.of("America/New_York"))
我基本上需要一个函数,它将采用 ZonedDateTime 的实例和 return 接下来的 1 分钟和 5 分钟值。
所以如果当前时间是:
2021-10-24T19:46:10.649817
下一分钟将是 19:47:00
,接下来的 5 分钟将是 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));
您可以使用以下功能来满足您的要求:
演示:
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]
从 Trail: Date Time. Check this answer and this answer 了解有关现代日期时间 API 的更多信息,以了解如何将 java.time
API 与 JDBC 一起使用.
注意: java.util
日期时间 API 及其格式 API、SimpleDateFormat
已过时且错误-易于。建议完全停止使用它们并切换到 modern Date-Time API*.
* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for 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.time 搞定了。