You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

定制日历开发需求:仅启用API返回的指定可配送日期

解决方案:自定义日历仅启用指定可配送日期

我之前也碰到过一模一样的需求,折腾了好几个日历库才摸透核心逻辑——先默认禁用所有日期的选择权限,再把API返回的可配送日期单独加入白名单。下面给你分不同平台/常用库的具体实现:

Android 端(Material Calendar View)

如果是Android开发,Material Calendar View是个很常用的库,实现起来很直接:
首先确保你已经添加了库依赖,然后在代码里这么写:

// 初始化日历视图
MaterialCalendarView calendarView = findViewById(R.id.calendar_view);

// 第一步:默认禁用所有日期(传入空集合即可)
calendarView.setSelectableDays(new HashSet<>());

// 第二步:调用API获取可配送日期列表(这里模拟API返回的ArrayList<CalendarDay>)
ArrayList<CalendarDay> deliverableDates = yourApiService.fetchDeliverableDates();

// 第三步:将可配送日期设置为可选择状态
calendarView.setSelectableDays(new HashSet<>(deliverableDates));

// 可选:添加日期选中后的回调逻辑
calendarView.setOnDateChangedListener((widget, selectedDate, isSelected) -> {
    if (isSelected) {
        // 处理用户选中可配送日期的逻辑,比如跳转下单页
    }
});

这里的关键是setSelectableDays方法:传入空集合时所有日期都会被禁用,传入API返回的日期集合后,只有这些日期会被解锁。

Web 端(FullCalendar)

如果是前端项目用FullCalendar,思路也是一样的,先锁死所有选择,再根据API返回的日期开放权限:

document.addEventListener('DOMContentLoaded', function() {
  const calendarEl = document.getElementById('calendar');

  const calendar = new FullCalendar.Calendar(calendarEl, {
    initialView: 'dayGridMonth',
    selectable: true,
    // 先默认禁用所有日期的选择
    selectAllow: () => false,
    // 异步获取可配送日期
    events: function(info, successCallback) {
      // 调用你的API接口
      fetch('/api/get-deliverable-dates')
        .then(res => res.json())
        .then(deliverableDates => {
          // 把日期转成FullCalendar能识别的事件格式(用来标记可配送日期)
          const events = deliverableDates.map(date => ({
            title: '可配送',
            start: date,
            allDay: true,
            backgroundColor: '#4CAF50' // 可选:给可配送日期加个绿色标记
          }));
          successCallback(events);
          // 更新选择规则:只允许选中可配送日期
          calendar.setOption('selectAllow', function(info) {
            const selectedDate = info.startStr.split('T')[0];
            return deliverableDates.includes(selectedDate);
          });
        });
    }
  });

  calendar.render();
});

特殊场景:固定星期几可配送(比如仅周五周六)

如果你的需求是固定每周的某几天可配送(不是动态API返回),那可以不用每次请求API,直接根据星期几来判断,效率更高:

Android 示例

calendarView.setDayValidator(day -> {
    int dayOfWeek = day.getCalendar().get(Calendar.DAY_OF_WEEK);
    // 允许周五(Calendar.FRIDAY)和周六(Calendar.SATURDAY)
    return dayOfWeek == Calendar.FRIDAY || dayOfWeek == Calendar.SATURDAY;
});

Web 示例(FullCalendar)

selectAllow: function(info) {
  const dayOfWeek = info.start.getDay();
  // 周日是0,周六是6,所以周五是5,周六是6
  return dayOfWeek === 5 || dayOfWeek === 6;
}

核心提醒:不管用什么库,一定要注意日期格式的统一——API返回的日期字符串/对象,要和日历组件使用的日期格式完全匹配,不然会出现白名单日期不生效的情况。

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

火山引擎 最新活动