PHP CLI 时间处理必须先设时区如 date_default_timezone_set('Asia/Shanghai'),再用 DateTime 类安全解析和格式化时间,避免 strtotime() 不可靠及 locale 导致的中文输出问题。

PHP CLI 中用 date() 函数转时间戳为日期串
命令行下 date() 和 Web 环境行为一致,但默认时区可能为空或为 UTC,不设时区容易得到错误结果。
- 必须先调用
date_default_timezone_set('Asia/Shanghai'),否则date('Y-m-d H:i:s')可能返回 UTC 时间 -
date()第二个参数可传入时间戳,不传则用当前时间:date('Y-m-d', 1717027200)→"2024-05-31" - 常见格式字符:
Y(4位年)、m(补零月)、d(补零日)、H(24小时制)、i(分钟)、s(秒)
从字符串解析时间再格式化:用 DateTime 类更可靠
当输入是类似 "2024-05-31 14:23:00" 或 "last Monday" 这类非标准时间字符串时,strtotime() 容易出错或不兼容,DateTime 更健壮。
- 构造失败会抛出
Exception,需 try/catch:new DateTime('invalid date')直接报错 - 支持相对时间表达式:
new DateTime('next Friday')、new DateTime('-3 days') - 格式化统一用
format()方法,和date()格式符一致
#!/usr/bin/env php
format('Y年m月d日 H:i') . "\n"; // 输出:2024年05月31日 10:15
} catch (Exception $e) {
fwrite(STDERR, "时间解析失败:{$e->getMessage()}\n");
}
?>
处理命令行参数传入的时间字符串
CLI 脚本常需接收用户传入的时间(如 php script.php --date="2024-06-01"),这时不能直接信任输入,要校验并标准化。
- 用
DateTime::createFromFormat()可指定输入格式,比new DateTime()更严格,避免误解析 - 检查返回值是否为
false,这是解析失败的明确信号(DateTime构造函数不返回 false) - 推荐组合:先
trim()去空格,再用createFromFormat('Y-m-d', $input),失败则 fallback 到宽松解析
$input = trim($argv[1] ?? '');
$dt = DateTime::createFromFormat('Y-m-d', $input);
if ($dt === false) {
$dt = new DateTime($input); // 尝试宽松解析
}
echo $dt->format('Y-m-d') . "\n";
注意 CLI 环境下的时区与系统 locale 差异
date() 和 DateTime 不受系统 locale 影响(比如中文星期名、月份名),只响应 date_default_timezone_set();若要输出本地化名称(如“六月”、“星期五”),得用 strftime() + setlocale(),但 CLI 下 locale 常未配置,极易失效。
立即学习“PHP免费学习笔记(深入)”;
- 不要在 CLI 脚本中依赖
strftime('%B')输出中文月份——大概率打出英文或乱码 - 想稳定输出中文,建议用数组映射:
$months = ['01' => '一月', ...],配合date('m')查表 - 检查当前 locale 是否生效:运行
locale -a | grep zh_CN,再在 PHP 中var_dump(setlocale(LC_TIME, 'zh_CN.UTF-8'))
date_default_timezone_set() 忘写或写错位置,会导致所有时间输出偏移 8 小时且难以复现。











