【问题标题】:How to calculate the next minute and next 5 minute intevals given a ZonedDateTime如何在给定 ZonedDateTime 的情况下计算下一分钟和接下来 5 分钟的间隔
【发布时间】:2021-12-10 13:22:33
【问题描述】:

我有一个 ZonedDatetime 的实例。

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

我基本上需要一个函数来获取 ZonedDateTime 的实例并返回接下来的 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) = {
  ???
}

【问题讨论】:

  • 您到底面临什么问题?您尝试了什么,但没有成功?
  • 只是想知道是否有某种方法可以做到这一点,而不必对 0、5、10、15、20、25、30、...60 之类的值以及1分钟间隔。我在这上面画一个空白!

标签: scala java-time zoneddatetime


【解决方案1】:

这样做相当简单,无需对值进行硬编码。不幸的是我对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));

【讨论】:

    【解决方案2】:

    您可以使用以下功能来满足您的要求:

    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]
    

    ONLINE DEMO

    通过 Trail: Date Time 了解有关现代日期时间 API 的更多信息。查看this answerthis answer 了解如何将java.time API 与JDBC 结合使用。

    注意:java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*


    * 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring。请注意,Android 8.0 Oreo 已经提供了support for java.time

    【讨论】:

      【解决方案3】:

      我们确实需要一些手工编码的数学来处理 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 会处理一切。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        • 2013-09-30
        • 1970-01-01
        • 2019-08-10
        • 2020-07-30
        • 1970-01-01
        相关资源
        最近更新 更多