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

如何在Java(安卓)中按日期顺序排序'MMM YYYY'格式日期字符串

Android Java 环境下MMM YYYY格式日期字符串排序方案

需求说明

将格式为MMM YYYY(英文月份缩写+4位年份)的日期字符串按时间先后升序排序,示例:

输入:
Sep 2019
Oct 2018
Nov 2019
Oct 2021
Nov 2011

期望输出:
Nov 2011
Oct 2018
Sep 2019
Nov 2019
Oct 2021

实现方案

方案1:SimpleDateFormat实现(全Android版本兼容)

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Locale;

// 核心代码
public void sortDateStrings() {
    // 1. 构造输入数据
    List<String> dateList = new ArrayList<>();
    dateList.add("Sep 2019");
    dateList.add("Oct 2018");
    dateList.add("Nov 2019");
    dateList.add("Oct 2021");
    dateList.add("Nov 2011");

    // 2. 初始化日期解析器,必须指定英文Locale否则解析英文月份缩写失败
    SimpleDateFormat sdf = new SimpleDateFormat("MMM yyyy", Locale.US);

    // 3. 自定义比较器排序
    Collections.sort(dateList, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            try {
                Date date1 = sdf.parse(o1);
                Date date2 = sdf.parse(o2);
                // 升序排序,倒序的话交换date1和date2即可
                return date1.compareTo(date2);
            } catch (ParseException e) {
                e.printStackTrace();
                // 解析失败的字符串默认排在末尾
                return 0;
            }
        }
    });

    // 4. 输出结果
    for (String date : dateList) {
        System.out.println(date);
    }
}

方案2:DateTimeFormatter实现(Android API 26+ 或引入ThreeTenABP兼容包支持)

该方案使用Java 8+时间API,解析器线程安全,更推荐使用:

import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

public void sortDateStrings() {
    List<String> dateList = new ArrayList<>();
    dateList.add("Sep 2019");
    dateList.add("Oct 2018");
    dateList.add("Nov 2019");
    dateList.add("Oct 2021");
    dateList.add("Nov 2011");

    // 线程安全的解析器,可作为全局常量使用
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM yyyy", Locale.US);

    Collections.sort(dateList, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            YearMonth ym1 = YearMonth.parse(o1, formatter);
            YearMonth ym2 = YearMonth.parse(o2, formatter);
            return ym1.compareTo(ym2);
        }
    });

    // 输出结果
    for (String date : dateList) {
        System.out.println(date);
    }
}

注意事项

  • 格式符必须用yyyy而非YYYY,后者是基于周计算的周年,跨年场景会出现解析错误
  • 必须指定Locale.US作为解析的区域参数,非英文系统默认Locale下无法识别英文月份缩写,会抛出解析异常
  • SimpleDateFormat是线程不安全的,不要作为静态常量在多线程场景共用,否则会出现并发错乱问题;DateTimeFormatter是线程安全的,可全局复用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:15:03