Java如何输出两个指定时间戳之间的分段日期时间节点列表
需求说明
需要开发后端程序根据用户输入的起止时间,生成对应时间节点插入数据表,规则为:
- 首节点为原始开始时间
- 中间按天生成每日23:59、次日00:00的节点
- 尾节点为原始结束时间
输入示例
StartTime: 11/26/2021 11:00 PM EndTime: 11/28/2021 04:00 AM
期望输出
11/26/2021 11:00 PM 11/26/2021 11:59 PM 11/27/2021 12:00 AM 11/27/2021 11:59 PM 11/28/2021 12:00 AM 11/28/2021 04:00 AM
现有代码问题分析
- 重复节点问题:原有循环逻辑已经遍历到结束日期的23:59,循环结束后又额外添加了结束日期的00:00和结束时间,导致节点重复,还多生成了不需要的结束日期23:59节点
- 时间精度问题:使用
LocalTime.MAX会得到带纳秒的23:59:59.999999999,不符合要求的分钟级精度23:59 - 输出格式问题:直接打印
LocalDateTime默认输出ISO标准格式,没有用定义好的格式化器转为要求的日期字符串格式
修正后实现代码
import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; public class TimeNodeGenerator { public static void main(String[] args) { String startTimeStr = "11/26/2021 11:00 PM"; String endTimeStr = "11/28/2021 04:00 AM"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"); LocalDateTime startTime = LocalDateTime.parse(startTimeStr, formatter); LocalDateTime endTime = LocalDateTime.parse(endTimeStr, formatter); List<LocalDateTime> timeNodes = new ArrayList<>(); // 先加入起始时间 timeNodes.add(startTime); LocalDateTime current = startTime; // 循环处理到结束日期的前一天 while (current.toLocalDate().isBefore(endTime.toLocalDate())) { // 添加当前天的23:59 timeNodes.add(current.with(LocalTime.of(23, 59))); // 跳到次日00:00并加入 current = current.plusDays(1).with(LocalTime.MIN); timeNodes.add(current); } // 最后加入结束时间 timeNodes.add(endTime); // 格式化输出 for (LocalDateTime node : timeNodes) { System.out.println(formatter.format(node)); } } }
代码运行输出
完全匹配期望结果:
11/26/2021 11:00 PM 11/26/2021 11:59 PM 11/27/2021 12:00 AM 11/27/2021 11:59 PM 11/28/2021 12:00 AM 11/28/2021 04:00 AM
内容的提问来源于stack exchange,提问作者DBANerd
相关产品推荐
相关产品推荐

