PHP strtotime()返回1970年日期且与time()比较异常问题求助
PHP日期字符串转换及比较异常问题解决
问题根源
- strtotime返回1970年日期的原因
PHP的strtotime()函数对斜杠/分隔的日期默认识别为mm/dd/YYYY格式,你传入的24/12/2021中24被判定为无效月份,函数返回false,传入date()函数后会被转为时间戳0对应的1970-01-01日期。 - 替换斜杠后比较逻辑异常的原因
把/替换为-之后,strtotime()会识别为dd-mm-YYYY格式,可正常转换时间戳,但你后续比较的是d/m/Y h:i:s格式的字符串,字符串比较是逐位对比字符ASCII值,不是按日期大小逻辑,必然会出现判断错误。比如01/10/2024字符串会比31/12/2023小,因为开头字符0<3,但实际日期前者更晚。
额外注意:date()格式中h为12小时制,H为24小时制,如果你的原始日期用24小时制计数,格式化时请使用H避免时间偏差
正确解决方案
方案1:使用DateTime类指定格式解析(推荐,无歧义)
直接指定输入日期的格式解析,不需要手动替换字符,不会出现格式识别错误:
var_dump($requestOrder->date); // 按输入的日/月/年 时:分:秒格式解析日期 $requestDate = DateTime::createFromFormat('d/m/Y H:i:s', $requestOrder->date); var_dump($requestDate->format('d/m/Y H:i:s')); // 后续日期比较直接用DateTime对象对比即可,逻辑准确 if($requestDate < new DateTime()) { // 你的业务逻辑 }
方案2:使用时间戳做数值比较
如果习惯使用时间戳处理,直接对比数值类型的时间戳即可,不要用格式化后的字符串做大小比较:
var_dump($requestOrder->date); // 替换斜杠后转时间戳 $requestTimestamp = strtotime(str_replace('/', '-', $requestOrder->date)); $requestDateStr = date('d/m/Y H:i:s', $requestTimestamp); var_dump($requestDateStr); // 直接比较时间戳数值 if($requestTimestamp < time()) { // 你的业务逻辑 }
内容的提问来源于stack exchange,提问作者FourBars
相关产品推荐
相关产品推荐

