获取与周期匹配的日期并获取序列号
Get Dates that match a periodicity and get number of sequence
我需要知道日期是否符合周期性,例如,周期性是 1 小时,用户提供的日期是 13/09/2021 23:00,我的 java代码应该是 13/09/2021 00:00 并检查必须添加 1 小时才能得到日期 13/09/2021 23:00.
现在的想法是做一个循环,将日期加上1小时,保存在一个数组中,然后检查日期是否在数组中和位置。还有其他办法吗?
如果我没理解错你的问题,你只是想计算两个日期之间相隔的小时数。为此,使用内置的 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
。看看 documentation。有很多不同的单位可供选择。
与 QBrute 的正确答案相比,我添加了一些小的改进。
周期可以是任何时间量,以小时、分钟和秒为单位。
我将时区考虑在内,因此我们也可以在夏令时转换(spring 向前和向后)和其他时间异常情况下获得正确的结果。
如果没有整数个周期,我正在四舍五入以确保至少有足够的。
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.
中介绍的
Link: Oracle tutorial: Date Time 解释如何使用 java.time.
我需要知道日期是否符合周期性,例如,周期性是 1 小时,用户提供的日期是 13/09/2021 23:00,我的 java代码应该是 13/09/2021 00:00 并检查必须添加 1 小时才能得到日期 13/09/2021 23:00.
现在的想法是做一个循环,将日期加上1小时,保存在一个数组中,然后检查日期是否在数组中和位置。还有其他办法吗?
如果我没理解错你的问题,你只是想计算两个日期之间相隔的小时数。为此,使用内置的 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
。看看 documentation。有很多不同的单位可供选择。
与 QBrute 的正确答案相比,我添加了一些小的改进。
周期可以是任何时间量,以小时、分钟和秒为单位。
我将时区考虑在内,因此我们也可以在夏令时转换(spring 向前和向后)和其他时间异常情况下获得正确的结果。
如果没有整数个周期,我正在四舍五入以确保至少有足够的。
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.
Link: Oracle tutorial: Date Time 解释如何使用 java.time.