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

如何在Expo中设置从指定日期开始每周重复的本地通知?

Expo本地通知:从指定日期开始每周重复的实现方案

Expo的本地通知API支持每周重复,但要让通知从指定日期启动,核心思路是先构造好首次触发的目标日期,再基于这个日期设置每周重复规则,具体步骤如下:

1. 构造指定的起始触发时间

先创建对应起始日期(比如7月1日)的Date对象,同时处理当前日期已过目标日期的情况(自动顺延到下一年的对应日期):

const startDate = new Date();
startDate.setMonth(6); // 月份从0开始,7月对应6
startDate.setDate(1);
startDate.setHours(9); // 设置通知触发的具体时间,比如上午9点
startDate.setMinutes(0);
startDate.setSeconds(0);

// 若当前日期已过目标起始日,自动顺延到下一年
const now = new Date();
if (startDate < now) {
  startDate.setFullYear(startDate.getFullYear() + 1);
}

2. 调用Expo通知API设置每周重复

使用scheduleNotificationAsync,将trigger.date设为刚才构造的起始日期,同时开启重复并指定周期为每周:

import * as Notifications from 'expo-notifications';

async function setupWeeklyNotification() {
  // 先申请通知权限
  const { status } = await Notifications.requestPermissionsAsync();
  if (status !== 'granted') {
    alert('请开启通知权限以使用该功能');
    return;
  }

  // 构造起始日期(代码同步骤1)
  const startDate = new Date();
  startDate.setMonth(6);
  startDate.setDate(1);
  startDate.setHours(9, 0, 0);
  
  const now = new Date();
  if (startDate < now) {
    startDate.setFullYear(startDate.getFullYear() + 1);
  }

  // 安排通知
  await Notifications.scheduleNotificationAsync({
    content: {
      title: '每周提醒',
      body: '这是从指定日期开始的每周重复通知',
    },
    trigger: {
      date: startDate,
      repeats: true,
      interval: 'week', // 指定每周重复
    },
  });
}

补充:指定每周固定星期几重复

如果需要不管起始日期是哪天,都固定每周某一天(比如周一)触发,可以先计算目标起始日期之后的第一个目标星期几,再作为首次触发时间:

// 获取目标日期之后的下一个指定星期几
// targetWeekday:1=周一,2=周二...7=周日
function getNextTargetWeekday(baseDate, targetWeekday) {
  const currentWeekday = baseDate.getDay() || 7; // 将周日转为7
  const daysToAdd = currentWeekday >= targetWeekday 
    ? (7 - currentWeekday + targetWeekday) 
    : (targetWeekday - currentWeekday);
  
  const nextTargetDay = new Date(baseDate);
  nextTargetDay.setDate(baseDate.getDate() + daysToAdd);
  nextTargetDay.setHours(9, 0, 0); // 设置触发时间
  return nextTargetDay;
}

// 示例:获取2024年7月1日之后的第一个周一
const baseStartDate = new Date(2024, 6, 1);
const firstTriggerDate = getNextTargetWeekday(baseStartDate, 1);
// 后续用firstTriggerDate作为trigger.date即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:22:43