PHP如何计算CSV电子表格中比赛起止时间的分钟差值
问题原因
- 你从CSV中读取到的开始、结束时间都是字符串类型,PHP直接对字符串做算术运算时会自动截取开头的数字部分进行计算,比如
10:45会被识别为数字10,最终结果自然不符合预期 - 现有代码逻辑存在两个错误:一是运算用了加法而非你需要的减法,二是差值计算逻辑写在了循环外,只会计算CSV最后一行数据的时间差
修复方案
核心是用PHP内置的strtotime()函数将时间字符串转为Unix时间戳(单位为秒),两个时间戳的差值除以60即可得到分钟级差值,修正后的代码如下:
<?php const Start = 2; const Finish = 3; if (($handle = fopen("racing.csv", "r")) !== FALSE) { // 如果CSV第一行是表头,取消下面一行的注释跳过表头 // fgetcsv($handle, 1000, ","); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $startTimeStr = $data[Start]; $endTimeStr = $data[Finish]; // 转换为时间戳 $startTimestamp = strtotime($startTimeStr); $endTimestamp = strtotime($endTimeStr); // 计算分钟差,新增跨天场景兼容 $diffSeconds = $endTimestamp - $startTimestamp; if ($diffSeconds < 0) { // 当日23点到次日1点这类跨天场景的兼容处理 $diffSeconds += 86400; } $diffMinutes = round($diffSeconds / 60); echo "差值 ".$startTimeStr." - ".$endTimeStr." = ".$diffMinutes."分钟\n"; } fclose($handle); } ?>
如果你的时间格式比较特殊strtotime()识别失败,可以用DateTime类指定格式解析更稳妥,示例如下:
// 示例为H:i格式的时间,比如10:45,如果你是其他格式可以自行修改第一个参数的格式规则 $startObj = DateTime::createFromFormat('H:i', $startTimeStr); $endObj = DateTime::createFromFormat('H:i', $endTimeStr); $diff = $startObj->diff($endObj); $diffMinutes = $diff->h * 60 + $diff->i;
内容的提问来源于stack exchange,提问作者stoperan
相关产品推荐
相关产品推荐

