PHP开发中,将字符串类型的日期转换为可处理的日期格式是常见需求,比如把用户输入的生日字符串转为时间戳计算年龄,或者把接口返回的日期字符串转为标准格式输出。strtotime和DateTime是处理这类需求最常用的工具,除此之外还有date_create等函数也能完成相关操作。

核心函数介绍
1. strtotime函数
strtotime是PHP内置的基础函数,作用是将任何英文文本的日期时间描述解析为 Unix 时间戳,使用门槛很低,适合处理格式规范的日期字符串。
基础语法:
<?php
// 将日期字符串转为时间戳
$time_str = "2024-05-20 12:30:00";
$timestamp = strtotime($time_str);
echo $timestamp; // 输出对应的Unix时间戳
// 支持相对日期描述
$next_week = strtotime("+1 week");
echo date("Y-m-d", $next_week); // 输出下周的日期
// 处理不规范的日期字符串
$str = "May 20th 2024";
$ts = strtotime($str);
echo date("Y-m-d", $ts); // 输出2024-05-20
?>
strtotime的优点是调用简单,不需要实例化对象,适合快速转换场景。但它依赖服务器的时区设置,如果时区配置错误会导致转换结果偏差,而且对于复杂自定义格式的日期字符串解析能力有限。
2. DateTime类
DateTime是PHP面向对象风格的日期处理类,功能比strtotime更强大,支持自定义日期格式解析、时区设置,适合处理复杂的日期转换需求。
基础用法示例:
<?php
// 创建DateTime对象并转换字符串
$date_str = "2024/05/20";
$date_obj = new DateTime($date_str);
echo $date_obj->getTimestamp(); // 获取时间戳
echo $date_obj->format("Y-m-d H:i:s"); // 格式化输出
// 自定义格式解析日期字符串
$str = "20-05-2024 14:30";
$date = DateTime::createFromFormat("d-m-Y H:i", $str);
if ($date) {
echo $date->format("Y年m月d日 H时i分");
}
// 设置时区避免转换偏差
$date = new DateTime("2024-05-20", new DateTimeZone("Asia/Shanghai"));
echo $date->format("Y-m-d H:i:s");
?>
DateTime的优势是可自定义解析格式,自带时区处理能力,还能直接调用类方法做日期加减、对比等操作,缺点是需要实例化对象,代码量比strtotime稍多。
3. date_create函数
date_create是DateTime类的过程化风格封装,功能和new DateTime基本一致,适合习惯过程化编程的开发者使用。
<?php
$str = "2024-05-20";
$date = date_create($str);
if ($date) {
echo date_format($date, "Y/m/d");
}
?>
函数对比与选择建议
我们可以通过下表对比三个常用函数的特点,方便根据场景选择:
| 函数/类 | 风格 | 自定义格式支持 | 时区处理 | 适用场景 |
|---|---|---|---|---|
| strtotime | 过程化 | 弱 | 依赖全局配置 | 简单规范日期字符串快速转时间戳 |
| DateTime | 面向对象 | 强 | 可自定义设置 | 复杂格式日期转换、需要日期计算、时区敏感场景 |
| date_create | 过程化 | 强 | 可自定义设置 | 习惯过程化编程的复杂日期转换场景 |
入门注意事项
- 转换前先确认日期字符串的格式,避免传入无法解析的内容,建议用
DateTime::createFromFormat处理非标准格式字符串,减少错误。 - 提前设置好PHP的默认时区,在php.ini中配置
date.timezone = Asia/Shanghai,或者在代码开头用date_default_timezone_set("Asia/Shanghai")设置,避免转换结果偏差。 - 如果只需要时间戳,优先用strtotime;如果需要后续做日期格式调整、日期计算,优先用DateTime类,扩展性更好。
对于PHP字符转日期的入门学习者,优先掌握strtotime和DateTime两个工具即可覆盖大部分日常开发需求,后续遇到特殊场景再扩展学习其他相关函数即可。