如何在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
相关产品推荐
相关产品推荐

