PHP时间戳转换完整教程
掌握PHP中处理Unix时间戳的所有技巧,包含time()、strtotime()、DateTime类的详细代码示例。
获取当前时间戳
使用不同方法获取当前Unix时间戳
PHP
<?php
// 获取当前时间戳(秒级)
$timestamp = time();
echo $timestamp; // 1735660800
// 获取当前时间戳(毫秒级)
$timestampMs = intval(microtime(true) * 1000);
echo $timestampMs; // 1735660800000
// 使用DateTime对象
$now = new DateTime();
$timestamp = $now->getTimestamp();
echo $timestamp; // 1735660800
// 获取微秒级时间戳
$microtime = microtime(true);
echo $microtime; // 1735660800.123456
?>时间戳转日期
将Unix时间戳转换为可读日期格式
PHP
<?php
// 使用date()函数
$timestamp = 1735660800;
echo date('Y-m-d H:i:s', $timestamp); // 2025-01-01 00:00:00
// 常用格式
echo date('Y年m月d日', $timestamp); // 2025年01月01日
echo date('Y/m/d', $timestamp); // 2025/01/01
echo date('H:i:s', $timestamp); // 00:00:00
echo date('l, F j, Y', $timestamp); // Wednesday, January 1, 2025
// 使用DateTime对象
$date = new DateTime("@$timestamp");
echo $date->format('Y-m-d H:i:s'); // 2025-01-01 00:00:00
// 设置时区后显示
$date->setTimezone(new DateTimeZone('Asia/Shanghai'));
echo $date->format('Y-m-d H:i:s');
?>日期转时间戳
将日期字符串转换为Unix时间戳
PHP
<?php
// 使用strtotime()函数
$timestamp = strtotime('2025-01-01');
echo $timestamp; // 1735660800
$timestamp = strtotime('2025-01-01 00:00:00');
echo $timestamp; // 1735660800
// 相对时间
$timestamp = strtotime('now');
$timestamp = strtotime('+1 day');
$timestamp = strtotime('+1 week');
$timestamp = strtotime('next Monday');
$timestamp = strtotime('last day of this month');
// 使用DateTime对象
$date = new DateTime('2025-01-01 00:00:00');
$timestamp = $date->getTimestamp();
// 指定格式解析
$date = DateTime::createFromFormat('Y-m-d H:i:s', '2025-01-01 00:00:00');
$timestamp = $date->getTimestamp();
?>日期格式化
将日期格式化为各种显示格式
PHP
<?php
$timestamp = 1735660800;
// 常用格式化字符
/*
Y - 4位年份 (2025)
y - 2位年份 (25)
m - 月份,带前导零 (01-12)
n - 月份,不带前导零 (1-12)
d - 日期,带前导零 (01-31)
j - 日期,不带前导零 (1-31)
H - 24小时制,带前导零 (00-23)
h - 12小时制,带前导零 (01-12)
i - 分钟,带前导零 (00-59)
s - 秒,带前导零 (00-59)
l - 星期几完整名称 (Sunday)
D - 星期几缩写 (Sun)
*/
// 格式化示例
echo date('Y-m-d', $timestamp); // 2025-01-01
echo date('Y/m/d H:i:s', $timestamp); // 2025/01/01 00:00:00
echo date('Y年m月d日 H时i分s秒', $timestamp); // 2025年01月01日 00时00分00秒
echo date('D, d M Y H:i:s', $timestamp); // Wed, 01 Jan 2025 00:00:00
// ISO 8601格式
echo date('c', $timestamp); // 2025-01-01T00:00:00+08:00
echo date('r', $timestamp); // Wed, 01 Jan 2025 00:00:00 +0800
?>时区处理
处理不同时区的时间戳转换
PHP
<?php
// 设置默认时区
date_default_timezone_set('Asia/Shanghai');
// 获取当前时区
echo date_default_timezone_get(); // Asia/Shanghai
// 使用DateTime处理时区
$timestamp = 1735660800;
// 创建UTC时间的DateTime
$utc = new DateTime("@$timestamp", new DateTimeZone('UTC'));
echo $utc->format('Y-m-d H:i:s'); // 2024-12-31 16:00:00
// 转换为北京时间
$beijing = clone $utc;
$beijing->setTimezone(new DateTimeZone('Asia/Shanghai'));
echo $beijing->format('Y-m-d H:i:s'); // 2025-01-01 00:00:00
// 转换为纽约时间
$newYork = clone $utc;
$newYork->setTimezone(new DateTimeZone('America/New_York'));
echo $newYork->format('Y-m-d H:i:s'); // 2024-12-31 11:00:00
// 常用时区
$timezones = [
'Asia/Shanghai' => '北京时间',
'Asia/Tokyo' => '东京时间',
'America/New_York' => '纽约时间',
'Europe/London' => '伦敦时间',
'UTC' => '协调世界时',
];
?>Carbon库(推荐)
使用Carbon库进行更优雅的时间处理
PHP
<?php
// 安装: composer require nesbot/carbon
use Carbon\Carbon;
// 获取当前时间戳
$timestamp = Carbon::now()->timestamp;
echo $timestamp; // 1735660800
// 时间戳转Carbon
$date = Carbon::createFromTimestamp(1735660800);
echo $date->format('Y-m-d H:i:s'); // 2025-01-01 00:00:00
// 获取当前时间
$now = Carbon::now();
$tomorrow = Carbon::tomorrow();
$yesterday = Carbon::yesterday();
// 时间操作
$date = Carbon::now();
$date->addDays(7); // 加7天
$date->subMonths(1); // 减1个月
$date->addHours(3); // 加3小时
// 时间差
$start = Carbon::create(2025, 1, 1);
$end = Carbon::create(2025, 1, 15);
$diff = $start->diffInDays($end); // 14天
// 人性化时间显示
echo Carbon::now()->diffForHumans(); // 几秒前
echo Carbon::now()->addHour()->diffForHumans(); // 1小时后
?>最佳实践
- •strtotime()很强大,支持相对时间如"+1 day"、"-1 week"
- •DateTime类比date()函数更灵活,推荐使用
- •处理时区时始终使用DateTimeZone类,避免手动计算
- •PHP 7.1+推荐使用Carbon库处理复杂时间逻辑
常见问题
PHP的time()返回的是秒还是毫秒?
time()返回秒级时间戳。如果需要毫秒级,使用microtime(true) * 1000。PHP 7.1+还可以使用hrtime(true)获取纳秒。
strtotime()解析失败返回什么?
strtotime()解析失败返回false。使用时应该检查返回值:$ts = strtotime($str); if ($ts === false) { // 解析失败 }
PHP如何处理时区?
推荐在脚本开头设置时区:date_default_timezone_set('Asia/Shanghai')。或者在php.ini中配置date.timezone。使用DateTime类可以更灵活地处理时区。
Carbon和原生DateTime的区别?
Carbon是DateTime的扩展,提供更友好的API和更多功能(如diffForHumans人性化显示)。项目复杂时推荐使用Carbon,简单场景用原生函数即可。