我需要知道日期是否与周期性匹配,例如,周期性是 1 小时,用户给出的日期是 13/09/2021 23:00,我的 java 代码应该采用的初始日期是 13/09/2021 00: 00 并检查必须增加 1 小时的次数才能获得日期 13/09/2021 23:00。
现在的想法是循环并在日期上添加1小时并保存在数组中,然后检查日期是否在数组和位置内。还有其他方法吗?
我需要知道日期是否与周期性匹配,例如,周期性是 1 小时,用户给出的日期是 13/09/2021 23:00,我的 java 代码应该采用的初始日期是 13/09/2021 00: 00 并检查必须增加 1 小时的次数才能获得日期 13/09/2021 23:00。
现在的想法是循环并在日期上添加1小时并保存在数组中,然后检查日期是否在数组和位置内。还有其他方法吗?
与 QBrute 的正确答案相比,我添加了一些小的改进。
周期性可以是任何时间量,以小时、分钟和秒为单位。
我将时区考虑在内,因此我们还可以在夏季时间转换(春季前行和后退)和其他时间异常情况下获得正确的结果。
如果没有整数个周期,我会四舍五入以确保至少有足够的周期。
ZoneId userTimeZone = ZoneId.of("Africa/Dar_es_Salaam");
Duration periodicity = Duration.ofMinutes(5);
ZonedDateTime userTime = ZonedDateTime.of(2021, 9, 13, 23, 0, 0, 0, userTimeZone);
ZonedDateTime initialTime = ZonedDateTime.of(2021, 9, 13, 0, 0, 0, 0, userTimeZone);
Duration timeBetween = Duration.between(initialTime, userTime);
long numberOfPeriodicities = timeBetween.dividedBy(periodicity);
// Has truncation occurred?
if (initialTime.plus(periodicity.multipliedBy(numberOfPeriodicities)).isBefore(userTime)) {
// Need one more periodicity
numberOfPeriodicities++;
}
System.out.println(numberOfPeriodicities);
输出是:
276
如果您想要 7.5 分钟的周期,请指定Duration.ofMinutes(7).plusSeconds(30)
. Duration.dividedBy(Duration)
我使用的方法是在 Java 9 中引入的。
链接:Oracle 教程:解释如何使用 java.time 的日期时间。
如果我正确理解您的问题,您只想计算两个日期之间有多少小时。为此,使用内置java.time
类更简洁。您可以将两个日期读入LocalDateTime
对象并计算它们之间的时间跨度ChronoUnit.HOURS
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
LocalDateTime start = LocalDateTime.parse("13/09/2021 00:00", formatter);
LocalDateTime end = LocalDateTime.parse("13/09/2021 23:00", formatter);
long hours = ChronoUnit.HOURS.between(start, end);
结果将是23
。
对于其他各种单位(例如分钟),有ChronoUnit.MINUTES
. 看看文档。有很多不同的单位可供选择。