如何在Kotlin中基于日期属性筛选上个月或本年度的对象列表
泛型列表日期过滤解决方案
一、推荐方案:统一使用Java 8+时间API(避免老API的坑)
Calendar和Date是旧版时间API,存在月份索引混乱(0代表1月)、线程不安全等问题,建议直接用LocalDate这类新API实现,代码更直观不易出错。
1. 日期字符串转LocalDate
用标准格式化工具解析你的yyyy-MM-dd格式日期:
val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
2. 计算过滤基准值
要注意上个月可能跨年度(比如1月的上个月是去年12月),所以需要同时获取上个月的年份和月份:
val now = LocalDate.now() val currentYear = now.year val lastMonthDate = now.minusMonths(1) val lastMonthYear = lastMonthDate.year val lastMonthValue = lastMonthDate.monthValue // 1-12的数字,和日期的实际月份一致
3. 执行列表过滤
直接用filter函数实现条件筛选:
val filteredList = responseList.filter { obj -> val objLocalDate = LocalDate.parse(obj.date, dateFormatter) val objYear = objLocalDate.year val objMonth = objLocalDate.monthValue // 核心条件:属于本年度 或者 属于上个月(含跨年度情况) objYear == currentYear || (objYear == lastMonthYear && objMonth == lastMonthValue) }
二、适配你现有代码的方案(如果坚持用Date/Calendar)
如果必须基于你已有的日期转换逻辑,需要注意Calendar的月份是0索引(1月对应0),要和你获取的lastMonth(LocalDate是1索引)做转换:
val now = LocalDate.now() val currentYear = now.year val lastMonthDate = now.minusMonths(1) // 把LocalDate的月份转成Calendar的0索引格式 val lastMonthCalendarIndex = lastMonthDate.monthValue - 1 val lastMonthYear = lastMonthDate.year val filteredList = responseList.filter { obj -> val dateFormated = getFormatedDate(obj.date) val cal = Calendar.getInstance().apply { time = dateFormated } val responseMonth = cal.get(Calendar.MONTH) val responseYear = cal.get(Calendar.YEAR) // 适配索引后的条件判断 responseYear == currentYear || (responseYear == lastMonthYear && responseMonth == lastMonthCalendarIndex) }
内容的提问来源于stack exchange,提问作者jvargas
相关产品推荐
相关产品推荐

