如何将HH:MM AM/PM格式时间传入本地推送localNotificationSchedule的date参数
解决方法
1. 12小时制时间字符串转当日总秒数
先写转换函数,把'hh:mm AM/PM'格式的时间转为当日0点开始计算的总秒数:
// 入例:'12:34 AM'、'09:23 PM' function convertTimeStrToDaySeconds(timeStr) { const [time, period] = timeStr.split(' '); let [hours, minutes] = time.split(':').map(Number); // 12小时制转24小时制 if (period === 'AM') { hours = hours === 12 ? 0 : hours; } else { hours = hours === 12 ? 12 : hours + 12; } return hours * 3600 + minutes * 60; }
比如输入'12:34 AM'会返回2040,输入'05:56 PM'会返回64560。
2. 计算距离当前时间的目标间隔秒数
如果只需要取最近的(当天/次日)对应时间的间隔秒数,按下面方法计算:
const targetDaySeconds = convertTimeStrToDaySeconds('12:34 AM'); const now = new Date(); // 计算当前时间对应的当日总秒数 const currentDaySeconds = now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds(); let diffSeconds = targetDaySeconds - currentDaySeconds; // 如果今天的目标时间已经过了,就加1天的秒数取次日的对应时间 if (diffSeconds < 0) { diffSeconds += 86400; } // 直接传入构造器即可得到触发时间 const triggerDate = new Date(Date.now() + diffSeconds * 1000);
3. 适配按指定星期重复的需求
你需要按周重复推送的话,不要用repeatType: 'day',调整为按周重复,同时计算第一个触发时间的星期偏移:
// 入参是你定义的星期数组,比如[1,4,7]代表周一、周三、周日 function getNearestWeekOffset(targetWeeks) { const now = new Date(); const currentWeekDay = now.getDay(); // JS原生返回0=周日,1=周一 // 把你的星期格式转成JS兼容的格式 const jsTargetWeeks = targetWeeks.map(w => w === 7 ? 0 : w); // 遍历找最近的符合要求的日期偏移量 for (let i = 0; i < 7; i++) { const checkDay = (currentWeekDay + i) % 7; if (jsTargetWeeks.includes(checkDay)) { // 如果是当天且目标时间已过,就取下一周的对应日期 if (i === 0 && diffSeconds < 0) { return i + 7; } return i; } } }
调整最终触发时间和推送配置:
const targetWeeks = [1,4,7]; const weekOffsetDays = getNearestWeekOffset(targetWeeks); // 加上星期偏移的秒数 diffSeconds += weekOffsetDays * 86400; const finalTriggerDate = new Date(Date.now() + diffSeconds * 1000); PushNotification.localNotificationSchedule({ message: "It's time to do some meditation:)", date: finalTriggerDate, allowWhileIdle: true, repeatType: 'week', // 按周重复 repeatTime: 1, // 每1周触发一次 });
内容的提问来源于stack exchange,提问作者Saurabh Kanswal
相关产品推荐
相关产品推荐

