预订网站24小时提前预订校验问题及代码咨询
解决预订网站的24小时提前预订判断问题
我明白你要实现的逻辑:用户必须提前24小时完成预订,所以当用户提交的日期时间和当前时间的间隔小于24小时时输出“no”,否则输出“yes”。你的代码思路是对的,但逻辑判断部分没写完,而且时间差的计算方向需要调整,我来帮你修正:
首先,核心逻辑要注意:我们需要判断用户选择的时间是否比当前时间晚至少24小时,所以应该用用户时间戳减去当前时间戳,而不是反过来。如果反过来计算,当用户时间在未来时差值会是负数,直接判断会出错。
修正后的完整代码
date_default_timezone_set('Asia/Kolkata'); // 假设$date和$time是用户提交的合法日期(如"2024-05-20")和时间(如"14:30") $userDateTimeStr = $date . ' ' . $time; $userTimestamp = strtotime($userDateTimeStr); $currentTimestamp = strtotime(date('Y-m-d H:i:s')); // 24小时对应的秒数 $twentyFourHoursInSec = 86400; // 先验证用户提交的时间格式是否合法 if ($userTimestamp === false) { echo "invalid datetime format"; } else { // 判断用户选择的时间是否比当前时间晚至少24小时 if ($userTimestamp - $currentTimestamp >= $twentyFourHoursInSec) { echo "yes"; } else { echo "no"; } }
关键细节说明
- 时间差计算方向:必须用
$userTimestamp - $currentTimestamp,确保当用户选择未来时间时差值为正,再判断是否达到24小时的秒数阈值。 - 输入合法性验证:加上
$userTimestamp === false的判断,避免用户提交非法格式的日期时间导致strtotime解析失败。 - 时区一致性:已经设置
Asia/Kolkata时区,确保当前时间和用户时间在同一时区下计算,不会出现偏差。
可选:用DateTime类实现(可读性更强)
如果用户提交的日期时间格式固定,也可以用PHP的DateTime类来处理,逻辑更直观:
date_default_timezone_set('Asia/Kolkata'); try { $userDateTime = new DateTime($date . ' ' . $time); $currentDateTime = new DateTime(); $timeDiff = $currentDateTime->diff($userDateTime); // 判断间隔是否至少24小时(跨天或当天满24小时) if ($timeDiff->days >= 1 || ($timeDiff->h >= 24 && $timeDiff->days == 0)) { echo "yes"; } else { echo "no"; } } catch (Exception $e) { echo "invalid datetime format"; }
内容的提问来源于stack exchange,提问作者Vedansh Malviya
相关产品推荐
相关产品推荐

