PHP(WordPress)中如何计算两个strtotime时间的HH:MM:SS格式差值
问题分析
你遇到的核心问题有两个:
- 时间差计算错误:
gmdate('H:i:s', $diff)中的H仅能表示0-23的小时数,当时间差超过24小时时会自动对24取模,导致结果被截断(比如46小时30分会被显示为22:30:00)。 - 数据库插入存在风险且语法错误:直接拼接变量会引发SQL注入,同时字符串类型的
$time未加引号会导致SQL语法报错。
正确实现方案
1. 正确计算跨天时间差(HH:MM:SS格式)
方法一:手动计算总小时数
通过总秒数差值拆分出小时、分钟、秒,避免小时数被截断:
// 拼接完整目标时间字符串(用24小时制避免AM/PM解析歧义) $target_str = $quiz_date . ' 20:30:00'; $target_time = strtotime($target_str); $submitted_time = strtotime('now'); // 计算总秒数差值 $diff_seconds = $submitted_time - $target_time; // 拆分小时、分钟、秒 $hours = floor($diff_seconds / 3600); $remaining_seconds = $diff_seconds % 3600; $minutes = floor($remaining_seconds / 60); $seconds = $remaining_seconds % 60; // 格式化为支持跨天的HH:MM:SS $time = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
方法二:使用DateTime类(推荐,更可靠)
利用DateTime的diff()方法获取时间间隔对象,直接计算总小时数:
// 创建目标时间对象 $target_time = DateTime::createFromFormat('Y-m-d H:i:s', $quiz_date . ' 20:30:00'); $submitted_time = new DateTime(); // 当前时间 // 计算时间间隔 $interval = $submitted_time->diff($target_time); // 计算总小时数:天数*24 + 剩余小时 $total_hours = $interval->days * 24 + $interval->h; // 格式化结果 $time = sprintf('%02d:%02d:%02d', $total_hours, $interval->i, $interval->s);
2. 安全插入MySQL数据库
在WordPress项目中,必须使用wpdb类处理数据库操作,彻底避免SQL注入:
global $wpdb; // 拼接带前缀的表名(WordPress默认前缀为wp_) $table_name = $wpdb->prefix . 'Results'; // 使用wpdb内置方法插入数据 $wpdb->insert( $table_name, array( 'user_id' => $user_id, 'Time' => $time ), array( '%d', // user_id为数字类型 '%s' // Time为字符串类型,若数据库字段为TIME类型也适用 ) );
若需执行原生SQL,必须用wpdb->prepare做参数绑定:
global $wpdb; $query = $wpdb->prepare( "INSERT INTO {$wpdb->prefix}Results (user_id, Time) VALUES (%d, %s);", $user_id, $time ); $wpdb->query($query);
数据库字段建议
如果Time字段存储的是时间间隔,建议设置为TIME类型(MySQL支持范围为-838:59:59到838:59:59,足够覆盖绝大多数场景);若需存储更长间隔,也可以用INT存储总秒数,读取时再格式化。
内容的提问来源于stack exchange,提问作者Prabhu Paul
相关产品推荐
相关产品推荐

