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

如何在MaterialDatePicker中禁用当前日期及未来日期?

实现MaterialDatePicker禁用当前及未来日期

要实现只能选择当前日期之前(含昨天)的日期,核心是通过CalendarConstraints设置可选日期的上限为昨天的时间戳,以下是具体实现步骤:

1. 计算精准的昨天时间戳

为避免直接减24小时带来的时区或跨天误差,推荐用LocalDate处理日期边界,确保限制到昨天的0点:

Kotlin 代码

import java.time.LocalDate
import java.time.ZoneId

// 获取昨天的日期,并转换为当天0点的时间戳
val yesterday = LocalDate.now().minusDays(1)
val yesterdayTimestamp = yesterday.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()

Java 代码

import java.time.LocalDate;
import java.time.ZoneId;

// 获取昨天的日期,并转换为当天0点的时间戳
LocalDate yesterday = LocalDate.now().minusDays(1);
long yesterdayTimestamp = yesterday.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();

2. 构建带日期限制的CalendarConstraints

通过CalendarConstraints.Builder设置日期上限,并添加验证器确保选中日期符合要求:

Kotlin 完整示例

import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.datepicker.CalendarConstraints

// 计算昨天的时间戳
val yesterday = LocalDate.now().minusDays(1)
val yesterdayTimestamp = yesterday.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()

// 构建日期约束
val constraintsBuilder = CalendarConstraints.Builder()
    .setEnd(yesterdayTimestamp) // 设置可选日期的最大上限为昨天
    .setValidator(object : CalendarConstraints.DateValidator {
        override fun isValid(date: Long): Boolean {
            return date <= yesterdayTimestamp // 强制验证选中日期不超过昨天
        }

        override fun describeContents(): Int = 0
        override fun writeToParcel(dest: android.os.Parcel, flags: Int) {}
    })

// 创建并显示日期选择器
val datePicker = MaterialDatePicker.Builder.datePicker()
    .setCalendarConstraints(constraintsBuilder.build())
    .setTitleText("选择日期")
    .build()

datePicker.show(supportFragmentManager, "DATE_PICKER_TAG")

Java 完整示例

import com.google.android.material.datepicker.MaterialDatePicker;
import com.google.android.material.datepicker.CalendarConstraints;
import android.os.Parcel;

// 计算昨天的时间戳
LocalDate yesterday = LocalDate.now().minusDays(1);
long yesterdayTimestamp = yesterday.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();

// 构建日期约束
CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder()
        .setEnd(yesterdayTimestamp)
        .setValidator(new CalendarConstraints.DateValidator() {
            @Override
            public boolean isValid(long date) {
                return date <= yesterdayTimestamp;
            }

            @Override
            public int describeContents() {
                return 0;
            }

            @Override
            public void writeToParcel(Parcel dest, int flags) {}
        });

// 创建并显示日期选择器
MaterialDatePicker<Long> datePicker = MaterialDatePicker.Builder.datePicker()
        .setCalendarConstraints(constraintsBuilder.build())
        .setTitleText("选择日期")
        .build();

datePicker.show(getSupportFragmentManager(), "DATE_PICKER_TAG");

补充说明

  • 若项目未使用Java 8+时间API,可改用Calendar类计算昨天时间戳:
    val calendar = Calendar.getInstance()
    calendar.add(Calendar.DATE, -1)
    val yesterdayTimestamp = calendar.timeInMillis
    
  • 确保已添加Material Components依赖到build.gradle:
    implementation 'com.google.android.material:material:1.9.0' // 版本可按需调整
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:20:43