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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:55:39