如何基于起止时间与循环次数生成时间对象列表?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
相关产品推荐
相关产品推荐

