time() 函数返回当前的 Unix 时间戳。Unix 时间戳表示从 Unix 纪元(1970年1月1日 00:00:00 UTC)到当前时间的秒数。
这是 PHP 中最基本、最常用的时间函数,用于获取当前时间的时间戳表示。
time() : int
| 参数 | 描述 |
|---|---|
| 无参数 |
|
返回当前时间的 Unix 时间戳(整数)。
<?php
// 获取当前时间的时间戳
$timestamp = time();
echo "当前时间戳: " . $timestamp . "<br>";
echo "格式化时间: " . date("Y-m-d H:i:s", $timestamp);
// 输出类似:
// 当前时间戳: 1692077445
// 格式化时间: 2023-08-15 10:30:45
?>
<?php
// 记录脚本开始时间
$start_time = time();
// 模拟一些耗时操作
for ($i = 0; $i < 1000000; $i++) {
// 空循环
}
// 记录脚本结束时间
$end_time = time();
// 计算执行时间
$execution_time = $end_time - $start_time;
echo "脚本执行耗时: " . $execution_time . " 秒";
// 输出类似:
// 脚本执行耗时: 2 秒
?>
<?php
// 生成基于时间戳的唯一ID
function generateTimeBasedId() {
$timestamp = time();
$random = rand(1000, 9999);
return $timestamp . $random;
}
$unique_id = generateTimeBasedId();
echo "生成的唯一ID: " . $unique_id;
echo "<br>";
echo "ID对应的时间: " . date("Y-m-d H:i:s", substr($unique_id, 0, 10));
// 输出类似:
// 生成的唯一ID: 16920774451234
// ID对应的时间: 2023-08-15 10:30:45
?>
<?php
// 检查验证码是否过期(有效期5分钟)
function isVerificationCodeExpired($created_at) {
$current_time = time();
$expiration_time = $created_at + (5 * 60); // 5分钟
if ($current_time > $expiration_time) {
return true; // 已过期
} else {
return false; // 未过期
}
}
// 模拟验证码创建时间(3分钟前)
$code_created_at = time() - (3 * 60);
if (isVerificationCodeExpired($code_created_at)) {
echo "验证码已过期";
} else {
echo "验证码有效";
$remaining = ($code_created_at + 300) - time();
echo ",剩余时间:" . $remaining . "秒";
}
// 输出类似:
// 验证码有效,剩余时间:120秒
?>
<?php
// 获取当前时间的不同格式
$timestamp = time();
echo "当前时间戳: " . $timestamp . "<br>";
echo "标准格式: " . date("Y-m-d H:i:s", $timestamp) . "<br>";
echo "美国格式: " . date("m/d/Y h:i:s A", $timestamp) . "<br>";
echo "只显示日期: " . date("l, F j, Y", $timestamp) . "<br>";
echo "只显示时间: " . date("H:i:s", $timestamp) . "<br>";
echo "ISO 8601格式: " . date("c", $timestamp) . "<br>";
echo "RFC 2822格式: " . date("r", $timestamp) . "<br>";
// 输出类似:
// 当前时间戳: 1692077445
// 标准格式: 2023-08-15 10:30:45
// 美国格式: 08/15/2023 10:30:45 AM
// 只显示日期: Tuesday, August 15, 2023
// 只显示时间: 10:30:45
// ISO 8601格式: 2023-08-15T10:30:45+08:00
// RFC 2822格式: Tue, 15 Aug 2023 10:30:45 +0800
?>
<?php
// 注意:time() 返回的是自 1970-01-01 00:00:00 UTC 以来的秒数
// 时区设置不影响 time() 的返回值,但影响 date() 的显示
// 设置时区为上海
date_default_timezone_set('Asia/Shanghai');
$timestamp_shanghai = time();
echo "上海时区: " . date("Y-m-d H:i:s", $timestamp_shanghai) . " (时间戳: " . $timestamp_shanghai . ")<br>";
// 设置时区为伦敦
date_default_timezone_set('Europe/London');
$timestamp_london = time();
echo "伦敦时区: " . date("Y-m-d H:i:s", $timestamp_london) . " (时间戳: " . $timestamp_london . ")<br>";
// 设置时区为纽约
date_default_timezone_set('America/New_York');
$timestamp_ny = time();
echo "纽约时区: " . date("Y-m-d H:i:s", $timestamp_ny) . " (时间戳: " . $timestamp_ny . ")<br>";
// 比较时间戳是否相同
echo "<br>三个时间戳是否相同: ";
if ($timestamp_shanghai === $timestamp_london && $timestamp_london === $timestamp_ny) {
echo "是,time() 返回相同的 Unix 时间戳";
} else {
echo "否,时间戳不同";
}
// 输出类似:
// 上海时区: 2023-08-15 18:30:45 (时间戳: 1692077445)
// 伦敦时区: 2023-08-15 11:30:45 (时间戳: 1692077445)
// 纽约时区: 2023-08-15 06:30:45 (时间戳: 1692077445)
//
// 三个时间戳是否相同: 是,time() 返回相同的 Unix 时间戳
?>
<?php
// 比较几种获取时间戳的方法
echo "time(): " . time() . "<br>";
echo "strtotime('now'): " . strtotime('now') . "<br>";
echo "mktime(): " . mktime() . "<br>";
// 使用 microtime() 获取更精确的时间
list($microseconds, $seconds) = explode(' ', microtime());
echo "microtime() 秒部分: " . $seconds . "<br>";
// 比较它们是否相同(应该相同或非常接近)
$time1 = time();
$time2 = strtotime('now');
$time3 = mktime();
echo "<br>比较结果:<br>";
echo "time() 和 strtotime('now') 是否相同: " . ($time1 === $time2 ? '是' : '否') . "<br>";
echo "time() 和 mktime() 是否相同: " . ($time1 === $time3 ? '是' : '否') . "<br>";
// 输出类似:
// time(): 1692077445
// strtotime('now'): 1692077445
// mktime(): 1692077445
// microtime() 秒部分: 1692077445
//
// 比较结果:
// time() 和 strtotime('now') 是否相同: 是
// time() 和 mktime() 是否相同: 是
?>
<?php
// 根据出生日期计算年龄
function calculateAge($birth_year, $birth_month, $birth_day) {
$current_timestamp = time();
$birth_timestamp = mktime(0, 0, 0, $birth_month, $birth_day, $birth_year);
$age = date('Y', $current_timestamp) - date('Y', $birth_timestamp);
// 如果今年的生日还没过,年龄减1
if (mktime(0, 0, 0, date('m', $current_timestamp), date('d', $current_timestamp), date('Y', $current_timestamp))
< mktime(0, 0, 0, $birth_month, $birth_day, date('Y', $current_timestamp))) {
$age--;
}
return $age;
}
$birth_year = 1990;
$birth_month = 8;
$birth_day = 15;
$age = calculateAge($birth_year, $birth_month, $birth_day);
echo "出生日期: {$birth_year}-{$birth_month}-{$birth_day}<br>";
echo "当前年龄: {$age} 岁";
// 如果今天是2023-08-15,输出: 当前年龄: 33 岁
// 如果今天是2023-08-14,输出: 当前年龄: 32 岁
?>
在32位系统中,Unix时间戳使用有符号32位整数存储,最大值为2,147,483,647(对应北京时间2038年1月19日11:14:07)。
当超过这个时间时,时间戳会溢出变成负数,导致日期计算错误。
解决方案:
DateTime 类,避免直接使用时间戳| 函数 | 精度 | 返回类型 | 适用场景 |
|---|---|---|---|
time() |
秒 | 整数 | 一般日期时间操作,如记录创建时间、过期时间检查 |
microtime() |
微秒 | 浮点数/字符串 | 性能测试、需要较高精度的计时 |
hrtime() |
纳秒 | 整数/数组 | 高精度性能分析、基准测试 |
time() 返回的是自 Unix 纪元以来的秒数,与时区无关time() 存在2038年问题microtime(true) 或 hrtime()time() 可能影响性能,可以考虑缓存结果date() 等格式化函数的输出,但不影响 time() 的返回值