You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:43:17