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

Kotlin待办App基于LocalDateTime的任务过滤问题修复

问题修复方案

一、日期显示异常修复

日期显示为+56411-10-10这类异常值,本质是Room存储/读取日期时的类型转换错误,大概率是时间戳单位不匹配(比如存秒读毫秒)或未正确使用日期类型转换器。

正确的Room日期存储方案(推荐用LocalDate)

  1. 添加日期类型转换器
class DateConverter {
    @TypeConverter
    fun fromLocalDate(date: LocalDate?): Long? {
        return date?.atStartOfDay(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
    }

    @TypeConverter
    fun toLocalDate(timestamp: Long?): LocalDate? {
        return timestamp?.let {
            Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault()).toLocalDate()
        }
    }
}
  1. 在Room Database类中注册转换器
@Database(entities = [Task::class], version = 1)
@TypeConverters(DateConverter::class)
abstract class TaskDatabase : RoomDatabase() {
    abstract fun taskDao(): TaskDao
}
  1. 确保Task实体类中日期字段类型为LocalDate
@Entity(tableName = "tasks")
data class Task(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val title: String,
    val dueDate: LocalDate? // 允许空值表示无截止日期
)

如果之前用Long类型存时间戳,检查存储时是否用了System.currentTimeMillis()(毫秒),读取时不要误转成秒,否则会导致日期异常。

二、任务过滤函数修正

基于修复后的LocalDate字段,编写正确的过滤逻辑:

1. 在ViewModel中定义过滤函数

class TaskViewModel(private val taskDao: TaskDao) : ViewModel() {
    private val allTasks = taskDao.getAllTasks().asLiveData()
    private val _currentFilter = MutableLiveData<TaskFilter>(TaskFilter.TODAY)
    val filteredTasks: LiveData<List<Task>> = Transformations.switchMap(_currentFilter) { filter ->
        Transformations.map(allTasks) { tasks ->
            val today = LocalDate.now()
            tasks.filter { task ->
                task.dueDate?.let { date ->
                    when (filter) {
                        TaskFilter.TODAY -> date == today
                        TaskFilter.PAST -> date.isBefore(today)
                        TaskFilter.FUTURE -> date.isAfter(today)
                    }
                } ?: false // 无截止日期的任务可根据需求调整是否保留
            }
        }
    }

    // 切换过滤类型
    fun setFilter(filter: TaskFilter) {
        _currentFilter.value = filter
    }
}

enum class TaskFilter {
    TODAY, PAST, FUTURE
}

2. LazyColumn中使用过滤后的列表

@Composable
fun TaskListScreen(viewModel: TaskViewModel) {
    val filteredTasks by viewModel.filteredTasks.observeAsState(emptyList())

    LazyColumn {
        items(filteredTasks) { task ->
            TaskItem(task = task)
        }
    }
}

关键注意点

  • 如果允许任务无截止日期,可修改过滤逻辑,比如将无日期的任务归到某一类,或在过滤时排除/全部保留。
  • 确保LocalDate.now()使用的时区和转换器中的时区一致(这里用系统默认时区),避免日期判断偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:35:01