Kotlin中如何比较API返回日期与当前日期以显示不同ImageView
问题根因与修复方案
一、初始日期判断逻辑错误点
- 错误1:调用
mTextDate.toString()获取的是TextView控件的对象描述字符串,不是控件展示的文本内容,正确写法应该是mTextDate.text.toString() - 错误2:你用来比较的两个字符串格式完全不一致:
mTextDate用FormatStyle.FULL格式化,输出类似2024年5月20日 星期一,而_date是dd-MMM-yyyy格式输出类似20-May-2024,字符串对比结果必然不符合预期 - 错误3:完全没必要转成字符串对比,你的代码里已经生成了两个
LocalDate对象:接口返回的date、当前本地日期gregorianDate,直接用LocalDate自带的时间比较方法即可,性能和准确率都更高
日期判断修复代码
直接替换你原来的if判断块即可:
when { date.isBefore(gregorianDate) -> mTick.setImageResource(R.drawable.tick) date.isAfter(gregorianDate) -> mTick.setImageResource(R.drawable.ic_logopng) else -> mTick.setImageResource(R.drawable.blue_logo) }
二、更新后时间判断逻辑错误点
- 错误1:判断条件重复,第三个分支你写的还是
event.startTime < time,等于的情况永远不会触发 - 错误2:业务逻辑写反:
event.startTime > currentTime是还没到开始时间,对应未开始状态;event.startTime < currentTime是已经过了开始时间,如果没到结束时间是进行中,过了结束时间是已完成;你现在的状态映射完全搞反了,所以只有大于的分支符合你的错误逻辑才会触发 - 额外注意:如果接口返回的
startTime时区和本地时区不一致,需要先做时区对齐再比较
时间判断修复代码
val currentTime = LocalTime.now() // 把接口返回的HH:mm格式字符串转成LocalTime val eventStartTime = LocalTime.parse(event.startTime, DateTimeFormatter.ofPattern("HH:mm")) when { eventStartTime.isAfter(currentTime) -> { // 未开始 mTextTimeEstimated.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.tick_upcoming_very_small, 0) } eventStartTime.isBefore(currentTime) -> { // 已开始,判断是否结束 val eventEndTime = LocalTime.parse(event.endTime, DateTimeFormatter.ofPattern("HH:mm")) if (eventEndTime.isAfter(currentTime)) { // 进行中 mTextTimeEstimated.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.tick_ongoing_very_small, 0) } else { // 已结束 mTextTimeEstimated.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.tick_completed_very_small, 0) } } else -> { // 刚好到开始时间,算进行中 mTextTimeEstimated.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.tick_ongoing_very_small, 0) } }
内容的提问来源于stack exchange,提问作者Enigma
相关产品推荐
相关产品推荐

