DateTime 类
使用面向对象的 DateTime API 创建和操作日期。
DateTime 类 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
DateTime 与过程式日期函数
PHP 同时提供过程式函数(date()、strtotime())和面向对象的 DateTime API。对于复杂操作,推荐使用面向对象的方式:
DateTime— 可变的日期时间对象DateTimeImmutable— 不可变对象(在现代代码中更安全)
创建 DateTime 对象
从各种输入创建 DateTime 对象:
<?php
$now = new DateTime(); // current time
$specific = new DateTime('2024-12-25 14:30:00'); // from string
$fromTs = new DateTime('@' . time()); // from Unix timestamp
echo $now->format('Y-m-d H:i:s');
echo $specific->format('D, d M Y');
// DateTimeImmutable is safer:
$dt = new DateTimeImmutable('2024-01-01');使用 format() 进行格式化
使用与 date() 相同的格式字符格式化 DateTime:
<?php
$dt = new DateTime('2024-05-27 14:30:00');
echo $dt->format('Y-m-d'); // 2024-05-27
echo $dt->format('H:i:s'); // 14:30:00
echo $dt->format('D d M Y, H:i'); // Mon 27 May 2024, 14:30
echo $dt->format('U'); // Unix timestamp
echo $dt->format(DateTime::ATOM); // ISO 8601modify()
使用相对表达式修改 DateTime:
<?php
$dt = new DateTime('2024-01-15');
$dt->modify('+1 month');
echo $dt->format('Y-m-d'); // 2024-02-15
$dt->modify('next Friday');
echo $dt->format('Y-m-d');
// DateTimeImmutable creates new object:
$dt2 = new DateTimeImmutable('2024-01-15');
$dt3 = $dt2->modify('+1 year'); // $dt2 unchangedcreateFromFormat()
使用指定格式解析日期字符串:
<?php
// Parse European date format
$dt = DateTime::createFromFormat('d/m/Y', '25/12/2024');
echo $dt->format('Y-m-d'); // 2024-12-25
// Parse with time
$dt2 = DateTime::createFromFormat('d.m.Y H:i', '27.05.2024 14:30');
echo $dt2->format('c'); // ISO 8601
// Returns false on failure:
$bad = DateTime::createFromFormat('Y-m-d', 'not-a-date');
var_dump($bad); // bool(false)比较 DateTime 对象
使用比较运算符比较 DateTime 对象:
<?php
$a = new DateTime('2024-01-01');
$b = new DateTime('2024-12-31');
var_dump($a < $b); // true
var_dump($a == $b); // false
var_dump($a > $b); // false
// Sort an array of DateTime:
$dates = [new DateTime('2024-06-01'), new DateTime('2024-01-01')];
usort($dates, fn($a, $b) => $a <=> $b);
echo $dates[0]->format('Y-m-d'); // 2024-01-01getTimestamp()
将 DateTime 转换为 Unix 时间戳:
<?php
$dt = new DateTime('2024-12-25');
$ts = $dt->getTimestamp();
echo $ts; // Unix timestamp for Dec 25 2024
// setTimestamp()
$dt2 = new DateTime();
$dt2->setTimestamp($ts);
echo $dt2->format('Y-m-d'); // 2024-12-25设置日期和时间部分
修改 DateTime 的各个组成部分:
<?php
$dt = new DateTime();
$dt->setDate(2024, 12, 25);
$dt->setTime(23, 59, 59);
echo $dt->format('Y-m-d H:i:s');
// 2024-12-25 23:59:59
// Or chain with DateTimeImmutable:
$dt = (new DateTimeImmutable())
->setDate(2024, 12, 25)
->setTime(0, 0, 0);实际应用中的 DateTime:订阅检查
实际应用:检查订阅是否仍处于有效状态:
<?php
function isSubscriptionActive(string $expiresAt): bool {
$expiry = new DateTimeImmutable($expiresAt);
$now = new DateTimeImmutable();
return $expiry > $now;
}
var_dump(isSubscriptionActive('2025-12-31')); // true
var_dump(isSubscriptionActive('2020-01-01')); // falseCarbon 库
Carbon 是一个常用的 PHP 库,通过流畅的 API 扩展了 DateTime:
<?php
// After: composer require nesbot/carbon
use Carbon\Carbon;
$now = Carbon::now();
$then = Carbon::parse('2024-01-01');
echo $now->diffForHumans($then); // '5 months after'
echo $now->addWeek()->format('Y-m-d');
echo Carbon::tomorrow()->isWeekday() ? 'weekday' : 'weekend';
// Locale-aware:
Carbon::setLocale('tr');
echo $now->diffForHumans($then); // TurkishISO 8601 与 DateTime::ATOM
在 API 和数据库中使用 ISO 8601 格式:
<?php
$dt = new DateTime();
// ISO 8601
echo $dt->format('c'); // 2024-05-27T14:30:00+03:00
echo $dt->format(DateTime::ATOM); // same
echo $dt->format(DateTime::RFC3339); // same family
// For JSON APIs:
$json = json_encode([
'created_at' => $dt->format(DateTime::ATOM)
]);
echo $json;快速检查
DateTime 与 DateTimeImmutable 之间的关键区别是什么?
回顾:DateTime 类
DateTime 面向对象编程要点:
- 使用
new DateTime('date string')创建 - 使用
format()输出 - 使用
modify()进行相对修改 - 使用
createFromFormat()解析自定义格式 - 优先使用
DateTimeImmutable,避免变更错误 - 在 API 中使用 ISO 8601(
DateTime::ATOM)
常见问题解答
「DateTime 类」课时是免费的吗?
是的 — 「DateTime 类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「DateTime 类」这节课中我会学到什么?
使用面向对象的 DateTime API 创建和操作日期。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「DateTime 类」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。