如何将"1 September 1899"类日期字符串转换为"1899-09-01"格式?
解决"日 月份英文名 年"转"YYYY-MM-DD"格式的问题
PHP 实现方案
你之前用date_parse_from_format失败大概率是格式匹配符用错了,针对"1 September 1899"这种完整月份名、无前导零日期、四位年份的格式,正确的格式符应该是'j F Y',而非'M jS Y'(M是月份缩写,jS带序数词后缀,比如1st)。
简洁实现(推荐)
用date_create_from_format直接解析字符串生成DateTime对象,再输出目标格式:
$date_str = "1 September 1899"; $date = date_create_from_format('j F Y', $date_str); if ($date) { echo $date->format('Y-m-d'); // 输出:1899-09-01 } else { echo "日期格式错误"; // 处理解析失败场景 }
手动解析方案(若需用date_parse_from_format)
解析后需校验错误,再手动构造日期字符串:
$date_str = "1 September 1899"; $parsed = date_parse_from_format('j F Y', $date_str); if ($parsed['error_count'] === 0 && $parsed['warning_count'] === 0) { $formatted = sprintf('%04d-%02d-%02d', $parsed['year'], $parsed['month'], $parsed['day']); echo $formatted; // 输出:1899-09-01 }
Python 实现方案(跨语言参考)
用datetime模块的strptime匹配格式,再转成目标输出:
from datetime import datetime date_str = "1 September 1899" date_obj = datetime.strptime(date_str, "%d %B %Y") print(date_obj.strftime("%Y-%m-%d")) # 输出:1899-09-01
常见错误排查
- 格式符不匹配:务必用
F(完整月份名)而非M(缩写如Sep);用j(无前导零的日)而非d(带前导零的日); - 语言环境问题:若PHP因语言设置无法识别英文月份名,可手动设置:
setlocale(LC_TIME, 'en_US.UTF-8');
内容的提问来源于stack exchange,提问作者Margaret Donald
相关产品推荐
相关产品推荐

