PHP:如何将GET获取的年份变量正确转换为指定日期格式?
解决方法
你的问题出在strtotime("$year")的解析逻辑上:单独传入年份字符串时,strtotime会将其解析为当前日期对应年份的同一天(比如当前是2023年10月5日,strtotime("2020")会得到2020-10-05的时间戳);如果$_GET['year']没有正确获取到值(比如为空),strtotime("")会返回当前时间戳,最终date函数就会使用当前年份。
下面是几种可靠的修改方案:
方案1:直接字符串拼接(最简单高效)
既然已经明确要获取目标年份的年初和年末,直接用年份字符串拼接日期部分即可,不需要调用日期处理函数:
$year = $_GET['year']; // 例如2020 $start = "$year-01-01"; // 直接得到2020-01-01 $stop = "$year-12-31"; // 直接得到2020-12-31
方案2:修复strtotime的参数
如果一定要用date和strtotime,可以给strtotime传入完整的日期字符串,确保解析准确:
$year = $_GET['year']; $start = date('Y-m-d', strtotime("$year-01-01")); $stop = date('Y-m-d', strtotime("$year-12-31"));
方案3:使用DateTime类(更健壮的面向对象方式)
PHP的DateTime类处理日期更可靠,尤其适合复杂的日期操作:
$year = $_GET['year']; $start = (new DateTime("$year-01-01"))->format('Y-m-d'); $stop = (new DateTime("$year-12-31"))->format('Y-m-d');
额外建议:验证年份有效性
为了避免无效输入导致的问题,建议先验证$_GET['year']是否为合法的四位数字:
if (isset($_GET['year']) && preg_match('/^\d{4}$/', $_GET['year'])) { $year = $_GET['year']; $start = "$year-01-01"; $stop = "$year-12-31"; } else { // 处理无效输入,比如默认使用当前年份 $year = date('Y'); $start = "$year-01-01"; $stop = "$year-12-31"; }
内容的提问来源于stack exchange,提问作者Michaël Thönnissen
相关产品推荐
相关产品推荐

