-2

我需要知道日期是否与周期性匹配,例如,周期性是 1 小时,用户给出的日期是 13/09/2021 23:00,我的 java 代码应该采用的初始日期是 13/09/2021 00: 00 并检查必须增加 1 小时的次数才能获得日期 13/09/2021 23:00。

现在的想法是循环并在日期上添加1小时并保存在数组中,然后检查日期是否在数组和位置内。还有其他方法吗?

4

2 回答 2

1

与 QBrute 的正确答案相比,我添加了一些小的改进。

  1. 周期性可以是任何时间量,以小时、分钟和秒为单位。

  2. 我将时区考虑在内,因此我们还可以在夏季时间转换(春季前行和后退)和其他时间异常情况下获得正确的结果。

  3. 如果没有整数个周期,我会四舍五入以确保至少有足够的周期。

    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 的日期时间。

于 2021-09-14T04:47:20.173 回答
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. 看看文档。有很多不同的单位可供选择。

于 2021-09-13T21:45:51.577 回答