PHP中如何判断并在事件开始日期前30天发送邮件
如何实现事件日期前30天的邮件触发逻辑
你的现有代码存在两个关键问题:一是strtotime()的参数顺序完全写错了,二是判断逻辑不符合需求——你需要的是当前日期恰好等于事件开始日期前30天,而非当前日期小于等于某个时间点。下面是针对需求的正确实现方案:
核心思路
- 精准解析你那
dd.mm.yyyy格式的事件起始日期(直接用strtotime可能因格式识别偏差出错) - 计算该日期往前推30天的提醒日期
- 忽略时分秒,只比较当前日期与提醒日期是否一致,同时结合事件状态判断,满足条件则发送邮件
推荐实现代码(用DateTime类,稳定可靠)
// 示例事件数据 $eventName = "name street Event"; $eventStatus = 0; $eventDateStart = "22.06.2018"; // dd.mm.yyyy格式 // 1. 解析事件起始日期为DateTime对象 $startDate = DateTime::createFromFormat('d.m.Y', $eventDateStart); if (!$startDate) { // 处理日期解析失败的情况 die("Invalid date format provided"); } // 2. 计算前30天的提醒日期(克隆原对象避免修改源数据) $reminderDate = clone $startDate; $reminderDate->modify('-30 days'); // 3. 获取当前日期(清零时分秒,确保只比较日期部分) $currentDate = new DateTime(); $currentDate->setTime(0, 0, 0); // 4. 判断是否到达提醒日期且事件状态符合要求 if ($currentDate == $reminderDate && $eventStatus == 0) { // 这里执行发送邮件的逻辑 echo "Sending reminder email for {$eventName}..."; }
代码细节说明
DateTime::createFromFormat('d.m.Y', $eventDateStart):专门针对dd.mm.yyyy格式解析日期,彻底避免strtotime可能把22.06.2018误判为其他日期的风险clone $startDate:防止直接修改原起始日期对象,保证数据的独立性setTime(0,0,0):将当前时间的时分秒清零,确保不会因为当天的时间差异(比如上午和下午)导致判断失效- 额外加入
$eventStatus == 0的判断,完全匹配你给出的事件状态条件
若坚持使用strtotime的替代方案
需要先把dd.mm.yyyy转换成yyyy-mm-dd格式再处理,否则strtotime可能解析错误:
$eventDateStart = "22.06.2018"; // 转换格式为yyyy-mm-dd $formattedStartDate = implode('-', array_reverse(explode('.', $eventDateStart))); $reminderTimestamp = strtotime($formattedStartDate . ' -30 days'); $currentDateTimestamp = strtotime(date('Y-m-d')); // 仅取当前日期的时间戳 if ($currentDateTimestamp == $reminderTimestamp && $eventStatus == 0) { // 执行发送邮件逻辑 }
不过还是更推荐使用DateTime类,它的日期处理能力更强大,代码可读性和维护性也更高。
内容的提问来源于stack exchange,提问作者Dumitru
相关产品推荐
相关产品推荐

