PHP交换字符串字符位置 解决两种CSV日期格式转换报错
问题根因
原有代码报错核心原因:
- PHP中
strtotime解析日期时,分隔符为-的日期会默认按日-月-年规则解析,分隔符为/的日期会默认按月/日/年规则解析。你把所有日期的/替换为-后,原本是月/日/年格式的日期会被误判为日-月-年,遇到日数值大于12的情况(比如06/13/2021替换后为06-13-2021),13不属于合法月份,strtotime返回false,后续格式化直接报错。 - 就算日期中日数值不超过12(比如
06/05/2021),自动解析也会出现月日错位的问题,结果不可靠。
实现方案
方案1:直接交换字符串内指定字段位置(适配你需要互换位置的需求)
针对斜杠分割的固定格式日期,不需要复杂日期函数,用explode拆分后调换片段顺序拼接即可,逻辑可以直接放在if条件分支中执行:
$string = '06/13/2021'; $segments = explode('/', $string); // 拆分后数组下标0为月、1为日、2为年,互换0和1的位置 $swappedString = $segments[1] . '/' . $segments[0] . '/' . $segments[2]; // 输出结果:13/06/2021
如果是固定长度无分隔符的字符串需要交换指定偏移位置的字符,用substr截取对应位置片段后重组即可。
方案2:适配双CSV场景的稳定日期格式化方案
你已知两个CSV文件的固定日期格式,不需要靠函数自动猜格式,用DateTime::createFromFormat指定源格式解析,从根源避免解析错误:
public function formatDate(string $date, string $sourceFormat = 'd/m/Y'): string { $date = trim($date); $dateObj = DateTime::createFromFormat($sourceFormat, $date); // 可按需自定义解析失败的处理逻辑 if (!$dateObj) { return ''; } return $dateObj->format('M j, Y'); }
调用时根据读取的CSV文件传对应源格式即可:
- 读取日/月/年格式的CSV时,调用
$this->formatDate($dateField, 'd/m/Y') - 读取月/日/年格式的CSV时,调用
$this->formatDate($dateField, 'm/d/Y')
提示:生产环境处理多来源日期时,永远优先明确指定源解析格式,不要依赖
strtotime的自动识别能力,避免出现月日错位、解析失败的隐性bug。
内容的提问来源于stack exchange,提问作者Zuby
相关产品推荐
相关产品推荐

