PHP time()函数

time() 函数返回当前的 Unix 时间戳。Unix 时间戳表示从 Unix 纪元(1970年1月1日 00:00:00 UTC)到当前时间的秒数。

这是 PHP 中最基本、最常用的时间函数,用于获取当前时间的时间戳表示。

语法

time() : int

参数说明

参数 描述
无参数

time() 函数不接受任何参数。

返回值

返回当前时间的 Unix 时间戳(整数)。

示例

示例 1:基本用法

<?php
// 获取当前时间的时间戳
$timestamp = time();
echo "当前时间戳: " . $timestamp . "<br>";
echo "格式化时间: " . date("Y-m-d H:i:s", $timestamp);

// 输出类似:
// 当前时间戳: 1692077445
// 格式化时间: 2023-08-15 10:30:45
?>

示例 2:计算时间差

<?php
// 记录脚本开始时间
$start_time = time();

// 模拟一些耗时操作
for ($i = 0; $i < 1000000; $i++) {
    // 空循环
}

// 记录脚本结束时间
$end_time = time();

// 计算执行时间
$execution_time = $end_time - $start_time;
echo "脚本执行耗时: " . $execution_time . " 秒";

// 输出类似:
// 脚本执行耗时: 2 秒
?>

示例 3:生成基于时间的唯一ID

<?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
?>

示例 4:检查时间是否过期

<?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秒
?>

示例 5:与date()函数配合使用

<?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
?>

示例 6:时区设置的影响

<?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 时间戳
?>

示例 7:与其他时间函数的比较

<?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() 是否相同: 是
?>

示例 8:计算年龄

<?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 岁
?>

Unix 时间戳的特点

优点
  • 简单统一 - 用一个整数表示时间
  • 时区无关 - 全球统一的时间表示
  • 易于计算 - 可以进行加减运算
  • 存储效率高 - 只需4字节(32位)或8字节(64位)
  • 兼容性好 - 多种编程语言和系统都支持
限制
  • 2038年问题 - 32位系统在2038年1月19日会溢出
  • 精度有限 - 只到秒级,无法表示毫秒/微秒
  • 不直观 - 人类难以直接理解
  • 无时区信息 - 需要额外处理时区转换
  • 范围有限 - 32位系统只能表示到2038年

2038年问题

2038年问题(Year 2038 Problem)

在32位系统中,Unix时间戳使用有符号32位整数存储,最大值为2,147,483,647(对应北京时间2038年1月19日11:14:07)。

当超过这个时间时,时间戳会溢出变成负数,导致日期计算错误。

解决方案:

  1. 使用64位系统,可以表示到约2900亿年之后
  2. 使用 DateTime 类,避免直接使用时间戳
  3. 使用字符串存储日期时间

time() vs microtime() vs hrtime()

函数 精度 返回类型 适用场景
time() 整数 一般日期时间操作,如记录创建时间、过期时间检查
microtime() 微秒 浮点数/字符串 性能测试、需要较高精度的计时
hrtime() 纳秒 整数/数组 高精度性能分析、基准测试

注意事项

  • time() 返回的是自 Unix 纪元以来的秒数,与时区无关
  • 在32位系统中,time() 存在2038年问题
  • 对于需要更高精度的场景,使用 microtime(true)hrtime()
  • 在循环中频繁调用 time() 可能影响性能,可以考虑缓存结果
  • 时区设置会影响 date() 等格式化函数的输出,但不影响 time() 的返回值

相关函数

  • date() - 格式化本地时间/日期
  • microtime() - 返回当前 Unix 时间戳的微秒数
  • mktime() - 取得一个日期的 Unix 时间戳
  • strtotime() - 将任何英文文本的日期时间描述解析为 Unix 时间戳
  • DateTime 类 - 面向对象的日期时间处理
  • hrtime() - 获取高精度时间(纳秒级)