You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于起止时间与循环次数生成时间对象列表?Java代码求助

解决你的时间列表生成问题

我看你现在需要实现一个根据起始时间、结束时间和循环次数生成均匀间隔时间点的功能,目前遇到了两个问题:时长计算不对,以及不知道怎么循环生成时间点,我来一步步帮你解决:

首先修正时长计算的问题

你现在用endTime.getTime() - startTime.getTime()得到的不是16,是因为Time.getTime()返回的是毫秒级时间戳(从1970年1月1日00:00:00 GMT到该时间的毫秒数),所以直接相减得到的是16小时对应的毫秒数(1636001000=57600000),不是整数16。要转换成小时数的话,得做单位转换:

long totalMilliseconds = endTime.getTime() - startTime.getTime();
long totalHours = totalMilliseconds / (1000 * 60 * 60); // 这时候得到的就是16了

然后实现循环生成时间点的逻辑

核心思路是先算出每个时间点之间的间隔毫秒数,然后从起始时间开始,每次累加这个间隔,生成新的时间对象加入列表。这里要注意两种常见的需求场景:

场景1:生成的最后一个时间点刚好是结束时间(最常用)

这种情况下,间隔的计算应该是总时长毫秒数 / (循环次数 - 1),因为起始时间是第一个点,结束时间是最后一个点,中间的间隔次数是循环次数减1。比如你说的循环次数5,总时长16小时,间隔就是16/(5-1)=4小时,生成的时间点是6:00、10:00、14:00、18:00、22:00。

场景2:按总时长平均分成循环次数段,取每段的起始点

如果你的需求是像示例里那样间隔3.2小时(16/5),那间隔就是总时长毫秒数 / 循环次数,这时候生成的5个点是6:00、9:20、12:40、16:00、19:20,最后一个点不会到结束时间。

完整代码实现(以场景1为例,附带场景2的修改说明)

import java.sql.Time;
import java.util.ArrayList;
import java.util.List;

public class TimeListGenerator {
    public List<Time> generateTimes(int looping) {
        List<Time> result = new ArrayList<>();
        String startStr = "06:00:00";
        String endStr = "22:00:00";
        
        Time startTime = Time.valueOf(startStr);
        Time endTime = Time.valueOf(endStr);
        
        // 计算总时长(毫秒)
        long totalMillis = endTime.getTime() - startTime.getTime();
        
        // 处理边界情况:如果循环次数为1,直接返回起始时间
        if (looping == 1) {
            result.add(startTime);
            return result;
        }
        
        // --- 场景1:最后一个点是结束时间 ---
        long intervalMillis = totalMillis / (looping - 1);
        
        // --- 如果你需要场景2的间隔,替换上面的代码为下面这行 ---
        // long intervalMillis = totalMillis / looping;
        
        // 循环生成时间点
        for (int i = 0; i < looping; i++) {
            long currentTimeMillis = startTime.getTime() + (intervalMillis * i);
            result.add(new Time(currentTimeMillis));
        }
        
        return result;
    }

    // 测试用例
    public static void main(String[] args) {
        TimeListGenerator generator = new TimeListGenerator();
        List<Time> times = generator.generateTimes(5);
        times.forEach(System.out::println);
    }
}

代码说明

  • 处理了循环次数为1的边界情况,避免除以0的错误
  • 两种场景的切换只需要修改间隔计算的那一行代码
  • 用Time类的构造方法直接通过时间戳生成新的时间对象,简单高效

内容的提问来源于stack exchange,提问作者AbdallahRizk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:33:57