按日期对ArrayList排序求助:LocalTime异常与日期不匹配问题
嘿,刚学编程一个月就碰到日期排序的坑,太正常了!我来帮你拆解一下问题,一步步搞定:
问题拆解与解决办法
1. 为什么用LocalTime会抛NumberFormatException?
你肯定是搞混Java时间类的分工了!LocalTime是专门用来处理时分秒的,完全不涉及年/月/日。而你的日期格式是MM-dd-yyyy(纯日期),用LocalTime去解析这种字符串,它找不到时间相关的数字,直接就炸了,抛出NumberFormatException(你可能打错成NumberExceptionError啦)。
正确姿势:处理纯日期就用LocalDate,带时间的日期才用LocalDateTime,别搞混!
2. 输出日期和输入不匹配的常见原因
- 格式字符串和输入格式对不上:比如你输入的是「05-12-2024」(5月12日),但代码里不小心把
DateTimeFormatter写成了dd-MM-yyyy,那它会把日期解析成12月5日,输出自然和预期不一样。一定要确保格式字符串和输入的日期格式完全一致! - 排序时用了字符串比较而非日期比较:如果直接对日期字符串排序,它会按字典序来(比如「10-01-2024」会排在「02-01-2024」前面,因为字符串里的「1」比「0」大),看起来日期顺序就乱了。必须先把字符串转成
LocalDate对象,再基于日期的自然顺序排序。
3. 正确的ArrayList日期排序示例
我给你写两种常见场景的代码,直接抄就能用:
场景1:ArrayList存的是日期字符串
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class DateStringSort { public static void main(String[] args) { ArrayList<String> dateList = new ArrayList<>(); dateList.add("03-15-2024"); dateList.add("01-20-2024"); dateList.add("02-10-2024"); // 定义和输入匹配的格式器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); // 核心:转成LocalDate再排序 Collections.sort(dateList, Comparator.comparing(str -> LocalDate.parse(str, formatter))); // 打印结果 for (String date : dateList) { System.out.println(date); } } }
场景2:ArrayList存的是带日期字段的自定义对象
比如你有个Task类,里面有LocalDate类型的日期字段:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; class Task { private String name; private LocalDate deadline; public Task(String name, LocalDate deadline) { this.name = name; this.deadline = deadline; } public LocalDate getDeadline() { return deadline; } // 重写toString,用指定格式打印日期 @Override public String toString() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); return name + " | 截止日期:" + formatter.format(deadline); } } public class ObjectDateSort { public static void main(String[] args) { ArrayList<Task> tasks = new ArrayList<>(); tasks.add(new Task("写报告", LocalDate.of(2024, 3, 15))); tasks.add(new Task("提交作业", LocalDate.of(2024, 1, 20))); tasks.add(new Task("准备面试", LocalDate.of(2024, 2, 10))); // 按日期排序 Collections.sort(tasks, Comparator.comparing(Task::getDeadline)); // 打印排序后的任务 for (Task task : tasks) { System.out.println(task); } } }
4. 日期打印的正确姿势
千万别直接打印LocalDate对象!它默认输出ISO标准格式(yyyy-MM-dd),和你要的MM-dd-yyyy不一样,这也是很多人觉得“输出和输入不匹配”的原因。
正确做法:用DateTimeFormatter的format()方法把日期转成你想要的格式:
LocalDate myDate = LocalDate.of(2024, 5, 20); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); System.out.println(formatter.format(myDate)); // 输出:05-20-2024
最后再划个重点
- 选对时间类:纯日期用
LocalDate,带时间用LocalDateTime,别碰LocalTime处理日期 - 格式字符串要精准:MM是两位月份,dd是两位日期,yyyy是四位年份,顺序别搞反
- 排序要基于日期对象,不是字符串!
内容的提问来源于stack exchange,提问作者Kyčor
相关产品推荐
相关产品推荐

