date() 函数是 PHP 中最常用的日期/时间函数之一,用于将 Unix 时间戳格式化为本地日期和时间。
date(string $format, int $timestamp = time()): string
| 参数 | 类型 | 描述 |
|---|---|---|
$format |
string | 必需。日期/时间的格式字符串 |
$timestamp |
int | 可选。Unix时间戳,默认为当前时间 |
返回格式化后的日期时间字符串,如果时间戳参数不是有效的数字,则返回 false。
以下是一些常用的格式字符:
| 字符 | 描述 |
|---|---|
d |
月份中的第几天,有前导零(01 到 31) |
D |
星期几的文本表示(Mon 到 Sun) |
j |
月份中的第几天,没有前导零(1 到 31) |
l |
星期几的完整文本表示(Sunday 到 Saturday) |
N |
ISO-8601 格式的星期几(1=Monday,7=Sunday) |
S |
每月天数后面的英文后缀(st, nd, rd, th) |
w |
星期几的数字表示(0=Sunday,6=Saturday) |
z |
年份中的第几天(0 到 365) |
W |
ISO-8601 格式的年份中的第几周 |
| 字符 | 描述 |
|---|---|
F |
月份的完整文本表示(January 到 December) |
m |
数字表示的月份,有前导零(01 到 12) |
M |
月份的三个字母缩写(Jan 到 Dec) |
n |
数字表示的月份,没有前导零(1 到 12) |
t |
给定月份的天数(28 到 31) |
| 字符 | 描述 |
|---|---|
L |
是否为闰年(1 表示是,0 表示否) |
o |
ISO-8601 格式的年份 |
Y |
4 位数字的年份(如 2023) |
y |
2 位数字的年份(如 23) |
| 字符 | 描述 |
|---|---|
a |
小写的上午和下午(am 或 pm) |
A |
大写的上午和下午(AM 或 PM) |
g |
12 小时格式,没有前导零(1 到 12) |
G |
24 小时格式,没有前导零(0 到 23) |
h |
12 小时格式,有前导零(01 到 12) |
H |
24 小时格式,有前导零(00 到 23) |
i |
分钟,有前导零(00 到 59) |
s |
秒,有前导零(00 到 59) |
<?php
// 设置时区
date_default_timezone_set('Asia/Shanghai');
// 当前时间
$timestamp = time();
echo "当前时间戳: " . $timestamp . "\n\n";
// 常用格式
echo "1. 完整日期时间: " . date('Y-m-d H:i:s', $timestamp) . "\n";
echo "2. 中文习惯格式: " . date('Y年m月d日 H时i分s秒', $timestamp) . "\n";
echo "3. 美国格式: " . date('m/d/Y', $timestamp) . "\n";
echo "4. 欧洲格式: " . date('d/m/Y', $timestamp) . "\n";
echo "5. 简短日期: " . date('y-m-d', $timestamp) . "\n";
echo "6. 可读格式: " . date('l, F jS, Y', $timestamp) . "\n";
echo "7. 时间格式: " . date('h:i:s A', $timestamp) . "\n";
echo "8. 24小时制: " . date('H:i:s', $timestamp) . "\n";
echo "9. ISO8601格式: " . date('c', $timestamp) . "\n";
echo "10. RFC2822格式: " . date('r', $timestamp) . "\n";
// 使用预定义常量
echo "\n使用预定义常量:\n";
echo "ATOM格式: " . date(DATE_ATOM, $timestamp) . "\n";
echo "COOKIE格式: " . date(DATE_COOKIE, $timestamp) . "\n";
echo "RFC822格式: " . date(DATE_RFC822, $timestamp) . "\n";
echo "RFC3339格式: " . date(DATE_RFC3339, $timestamp) . "\n";
?>
输出:
当前时间戳: 1703500245
1. 完整日期时间: 2023-12-25 14:30:45
2. 中文习惯格式: 2023年12月25日 14时30分45秒
3. 美国格式: 12/25/2023
4. 欧洲格式: 25/12/2023
5. 简短日期: 23-12-25
6. 可读格式: Monday, December 25th, 2023
7. 时间格式: 02:30:45 PM
8. 24小时制: 14:30:45
9. ISO8601格式: 2023-12-25T14:30:45+08:00
10. RFC2822格式: Mon, 25 Dec 2023 14:30:45 +0800
使用预定义常量:
ATOM格式: 2023-12-25T14:30:45+08:00
COOKIE格式: Monday, 25-Dec-2023 14:30:45 CST
RFC822格式: Mon, 25 Dec 23 14:30:45 +0800
RFC3339格式: 2023-12-25T14:30:45+08:00
<?php
date_default_timezone_set('Asia/Shanghai');
// 当前时间
$now = time();
echo "1. 今天是本周的第 " . date('N', $now) . " 天(1=星期一,7=星期日)\n";
echo "2. 今年是 " . (date('L', $now) ? '闰年' : '平年') . "\n";
echo "3. 这个月有 " . date('t', $now) . " 天\n";
echo "4. 今天是今年的第 " . (date('z', $now) + 1) . " 天\n";
echo "5. 当前是第 " . date('W', $now) . " 周\n";
echo "6. 今天是本月第 " . date('jS', $now) . " 天\n";
// 动态消息
$hour = date('G', $now);
if ($hour < 6) {
echo "7. 现在是凌晨\n";
} elseif ($hour < 12) {
echo "7. 现在是上午\n";
} elseif ($hour < 14) {
echo "7. 现在是中午\n";
} elseif ($hour < 18) {
echo "7. 现在是下午\n";
} else {
echo "7. 现在是晚上\n";
}
// 计算其他日期
echo "\n时间计算示例:\n";
echo "明天: " . date('Y-m-d', strtotime('+1 day', $now)) . "\n";
echo "一周后: " . date('Y-m-d', strtotime('+1 week', $now)) . "\n";
echo "一个月后: " . date('Y-m-d', strtotime('+1 month', $now)) . "\n";
echo "一年后: " . date('Y-m-d', strtotime('+1 year', $now)) . "\n";
echo "下周一: " . date('Y-m-d', strtotime('next Monday', $now)) . "\n";
echo "本月最后一天: " . date('Y-m-d', strtotime('last day of this month', $now)) . "\n";
// 时间差计算
$start = strtotime('2023-12-01');
$end = strtotime('2023-12-25');
$days = ceil(($end - $start) / 86400);
echo "\n距离圣诞节还有: " . $days . " 天\n";
?>
输出:
1. 今天是本周的第 1 天(1=星期一,7=星期日)
2. 今年是 平年
3. 这个月有 31 天
4. 今天是今年的第 359 天
5. 当前是第 52 周
6. 今天是本月第 25th 天
7. 现在是下午
时间计算示例:
明天: 2023-12-26
一周后: 2024-01-01
一个月后: 2024-01-25
一年后: 2024-12-25
下周一: 2024-01-01
本月最后一天: 2023-12-31
距离圣诞节还有: 24 天
<?php
/**
* 文件备份类 - 使用日期时间命名备份文件
*/
class FileBackupSystem {
private $sourceDir;
private $backupDir;
public function __construct(string $sourceDir, string $backupDir) {
$this->sourceDir = rtrim($sourceDir, '/');
$this->backupDir = rtrim($backupDir, '/');
// 确保备份目录存在
if (!is_dir($this->backupDir)) {
mkdir($this->backupDir, 0755, true);
}
}
/**
* 创建带时间戳的备份文件名
*/
private function generateBackupFilename(string $originalFilename, string $format = 'Ymd_His'): string {
$ext = pathinfo($originalFilename, PATHINFO_EXTENSION);
$name = pathinfo($originalFilename, PATHINFO_FILENAME);
$timestamp = date($format);
return $name . '_' . $timestamp . ($ext ? '.' . $ext : '');
}
/**
* 备份单个文件
*/
public function backupFile(string $filename): bool {
$sourcePath = $this->sourceDir . '/' . $filename;
$backupPath = $this->backupDir . '/' . $this->generateBackupFilename($filename);
if (!file_exists($sourcePath)) {
return false;
}
return copy($sourcePath, $backupPath);
}
/**
* 备份整个目录
*/
public function backupDirectory(array $exclude = []): array {
$results = [];
$files = scandir($this->sourceDir);
foreach ($files as $file) {
if ($file === '.' || $file === '..') {
continue;
}
if (in_array($file, $exclude)) {
continue;
}
$sourcePath = $this->sourceDir . '/' . $file;
if (is_file($sourcePath)) {
$results[$file] = $this->backupFile($file);
}
}
return $results;
}
/**
* 获取备份文件列表(按时间排序)
*/
public function listBackups(string $pattern = '*_*'): array {
$backups = glob($this->backupDir . '/' . $pattern);
// 按修改时间排序
usort($backups, function($a, $b) {
return filemtime($b) - filemtime($a);
});
return $backups;
}
/**
* 清理旧备份(保留最近N天)
*/
public function cleanupOldBackups(int $keepDays = 30): array {
$deleted = [];
$backups = $this->listBackups();
$cutoffTime = time() - ($keepDays * 86400);
foreach ($backups as $backup) {
if (filemtime($backup) < $cutoffTime) {
if (unlink($backup)) {
$deleted[] = basename($backup);
}
}
}
return $deleted;
}
/**
* 生成备份报告
*/
public function generateReport(): string {
$backups = $this->listBackups();
$report = "备份系统报告\n";
$report .= "生成时间: " . date('Y-m-d H:i:s') . "\n";
$report .= "备份目录: " . $this->backupDir . "\n";
$report .= "备份文件数: " . count($backups) . "\n\n";
$report .= "最近备份文件:\n";
for ($i = 0; $i < min(5, count($backups)); $i++) {
$filename = basename($backups[$i]);
$filetime = date('Y-m-d H:i:s', filemtime($backups[$i]));
$report .= ($i + 1) . ". {$filename} (备份于 {$filetime})\n";
}
return $report;
}
}
// 使用示例
date_default_timezone_set('Asia/Shanghai');
// 创建备份系统实例
$backupSystem = new FileBackupSystem('/var/www/html/uploads', '/var/backups');
echo "文件备份系统演示\n\n";
// 备份单个文件
echo "1. 备份单个文件:\n";
$result = $backupSystem->backupFile('database.sql');
echo "备份结果: " . ($result ? '成功' : '失败') . "\n\n";
// 备份目录
echo "2. 备份目录:\n";
$results = $backupSystem->backupDirectory(['temp.txt', 'cache']);
$successCount = count(array_filter($results));
echo "成功备份 {$successCount} 个文件\n\n";
// 列出备份
echo "3. 备份文件列表:\n";
$backups = $backupSystem->listBackups();
foreach (array_slice($backups, 0, 3) as $backup) {
$filename = basename($backup);
$filetime = date('Y-m-d H:i:s', filemtime($backup));
echo " - {$filename} (备份于 {$filetime})\n";
}
// 生成报告
echo "\n4. 系统报告:\n";
echo $backupSystem->generateReport();
// 日期格式在日志系统中的应用
echo "\n5. 日志系统示例:\n";
$logEntries = [
['user' => 'admin', 'action' => 'login', 'ip' => '192.168.1.1'],
['user' => 'user1', 'action' => 'upload', 'filename' => 'test.jpg'],
['user' => 'user2', 'action' => 'download', 'filename' => 'document.pdf'],
];
$logFile = 'logs/' . date('Y-m-d') . '_access.log';
foreach ($logEntries as $entry) {
$logLine = date('[Y-m-d H:i:s]') . " " . json_encode($entry) . "\n";
echo "日志内容: " . $logLine;
// file_put_contents($logFile, $logLine, FILE_APPEND);
}
?>
输出:
文件备份系统演示
1. 备份单个文件:
备份结果: 成功
2. 备份目录:
成功备份 3 个文件
3. 备份文件列表:
- database_20231225_143045.sql (备份于 2023-12-25 14:30:45)
- config_20231224_093012.ini (备份于 2023-12-24 09:30:12)
- backup_20231223_153045.zip (备份于 2023-12-23 15:30:45)
4. 系统报告:
备份系统报告
生成时间: 2023-12-25 14:30:45
备份目录: /var/backups
备份文件数: 8
最近备份文件:
1. database_20231225_143045.sql (备份于 2023-12-25 14:30:45)
2. config_20231224_093012.ini (备份于 2023-12-24 09:30:12)
3. backup_20231223_153045.zip (备份于 2023-12-23 15:30:45)
4. data_20231222_083000.json (备份于 2023-12-22 08:30:00)
5. app_20231221_173045.log (备份于 2023-12-21 17:30:45)
5. 日志系统示例:
日志内容: [2023-12-25 14:30:45] {"user":"admin","action":"login","ip":"192.168.1.1"}
日志内容: [2023-12-25 14:30:45] {"user":"user1","action":"upload","filename":"test.jpg"}
日志内容: [2023-12-25 14:30:45] {"user":"user2","action":"download","filename":"document.pdf"}
| 常量 | 格式 | 示例 |
|---|---|---|
DATE_ATOM |
Y-m-d\TH:i:sP | 2023-12-25T14:30:45+08:00 |
DATE_COOKIE |
l, d-M-Y H:i:s T | Monday, 25-Dec-2023 14:30:45 CST |
DATE_ISO8601 |
Y-m-d\TH:i:sO | 2023-12-25T14:30:45+0800 |
DATE_RFC822 |
D, d M y H:i:s O | Mon, 25 Dec 23 14:30:45 +0800 |
| 常量 | 格式 | 示例 |
|---|---|---|
DATE_RFC850 |
l, d-M-y H:i:s T | Monday, 25-Dec-23 14:30:45 CST |
DATE_RFC1036 |
D, d M y H:i:s O | Mon, 25 Dec 23 14:30:45 +0800 |
DATE_RFC1123 |
D, d M Y H:i:s O | Mon, 25 Dec 2023 14:30:45 +0800 |
DATE_RFC2822 |
D, d M Y H:i:s O | Mon, 25 Dec 2023 14:30:45 +0800 |
<?php
// 错误:未设置时区,可能使用服务器默认时区
echo date('Y-m-d H:i:s');
// 正确:明确设置时区
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s');
?>
<?php
// 错误:使用小写y表示年份,可能不是期望的格式
echo date('y-m-d'); // 输出: 23-12-25
// 正确:根据需求选择格式字符
echo date('Y-m-d'); // 输出: 2023-12-25
echo date('y-m-d'); // 输出: 23-12-25(如果要两位年份)
// 注意:m和n的区别
echo date('Y-m-d'); // 输出: 2023-01-01
echo date('Y-n-d'); // 输出: 2023-1-01
?>
<?php
// 错误:在32位系统上,时间戳可能溢出
$timestamp = 2147483648; // 超过32位最大时间戳
// echo date('Y-m-d', $timestamp); // 可能产生错误
// 正确:检查时间戳范围
if (PHP_INT_SIZE === 4) { // 32位系统
if ($timestamp > 2147483647) {
echo "警告:时间戳超出32位系统范围\n";
}
}
// 使用DateTime对象处理大时间戳
if (class_exists('DateTime')) {
$date = new DateTime();
$date->setTimestamp($timestamp);
echo $date->format('Y-m-d');
}
?>
date() 前务必使用 date_default_timezone_set() 设置正确的时区。date() 会产生性能开销,考虑缓存结果或使用更高效的方法。date() 返回的是英文日期,如需本地化日期,使用 strftime() 或国际化扩展。date('I') 可以检查当前是否处于夏令时。false。time()返回当前的Unix时间戳
strtotime()将英文文本日期时间解析为Unix时间戳
gmdate()格式化GMT/UTC日期和时间
mktime()取得一个日期的Unix时间戳
strftime()根据区域设置格式化本地时间/日期
DateTime::format()面向对象风格的日期格式化方法