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

按日期对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:13:26