PHP mktime()函数

mktime() 函数返回一个日期的Unix时间戳。Unix时间戳表示从Unix纪元(1970年1月1日 00:00:00 GMT)到指定时间的秒数。

这个函数对于创建自定义日期、验证日期、计算日期差等操作非常有用。

语法

mktime(
    int $hour = date("H"),
    int $minute = date("i"),
    int $second = date("s"),
    int $month = date("m"),
    int $day = date("d"),
    int $year = date("Y")
) : int|false

参数说明

参数 默认值 描述
hour 当前小时 小时数,0 到 23。超过23的值会进位到天
minute 当前分钟 分钟数,0 到 59。超过59的值会进位到小时
second 当前秒数 秒数,0 到 59。超过59的值会进位到分钟
month 当前月份 月份,1 到 12。超过12的值会进位到年
day 当前日 日,1 到 31。超过当月天数的值会进位到月
year 当前年份 年份,1 到 32767。如果只有两位数,则会自动转换为4位数(0-69转换为2000-2069,70-99转换为1970-1999)

返回值

返回指定日期时间的Unix时间戳(整数)。如果日期非法,返回 false

示例

示例 1:创建当前时间的时间戳

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

// 输出类似:
// 当前时间的时间戳:1679876543
// 格式化时间:2023-03-26 14:15:43
?>

示例 2:创建指定日期的时间戳

<?php
// 创建2023年8月15日 10:30:45的时间戳
$timestamp = mktime(10, 30, 45, 8, 15, 2023);
echo "时间戳:" . $timestamp;
echo "<br>";
echo "格式化时间:" . date("Y-m-d H:i:s", $timestamp);

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

示例 3:使用两位数年份

<?php
// 使用两位数年份
$timestamp1 = mktime(0, 0, 0, 1, 1, 70);  // 1970年
echo "1970-01-01: " . date("Y-m-d", $timestamp1);

echo "<br>";

$timestamp2 = mktime(0, 0, 0, 1, 1, 69);  // 2069年
echo "2069-01-01: " . date("Y-m-d", $timestamp2);

echo "<br>";

$timestamp3 = mktime(0, 0, 0, 1, 1, 99);  // 1999年
echo "1999-01-01: " . date("Y-m-d", $timestamp3);

// 输出:
// 1970-01-01: 1970-01-01
// 2069-01-01: 2069-01-01
// 1999-01-01: 1999-01-01
?>

示例 4:计算日期差

<?php
// 计算两个日期的天数差
function getDaysBetweenDates($date1, $date2) {
    $timestamp1 = mktime(0, 0, 0,
        substr($date1, 5, 2),  // 月
        substr($date1, 8, 2),  // 日
        substr($date1, 0, 4)   // 年
    );

    $timestamp2 = mktime(0, 0, 0,
        substr($date2, 5, 2),
        substr($date2, 8, 2),
        substr($date2, 0, 4)
    );

    $diff = abs($timestamp2 - $timestamp1);
    $days = floor($diff / (60 * 60 * 24));

    return $days;
}

$start_date = "2023-01-01";
$end_date = "2023-12-31";
$days = getDaysBetweenDates($start_date, $end_date);
echo "从{$start_date}到{$end_date}共有{$days}天";

// 输出:
// 从2023-01-01到2023-12-31共有364天
?>

示例 5:验证日期是否合法

<?php
function isValidDate($year, $month, $day) {
    $timestamp = mktime(0, 0, 0, $month, $day, $year);
    return $timestamp !== false;
}

// 测试合法日期
$date1 = isValidDate(2023, 2, 28);  // 合法
$date2 = isValidDate(2023, 2, 29);  // 不合法(2023年不是闰年)
$date3 = isValidDate(2024, 2, 29);  // 合法(2024年是闰年)
$date4 = isValidDate(2023, 13, 1);  // 不合法

echo "2023-02-28: " . ($date1 ? "合法" : "不合法") . "<br>";
echo "2023-02-29: " . ($date2 ? "合法" : "不合法") . "<br>";
echo "2024-02-29: " . ($date3 ? "合法" : "不合法") . "<br>";
echo "2023-13-01: " . ($date4 ? "合法" : "不合法") . "<br>";

// 输出:
// 2023-02-28: 合法
// 2023-02-29: 不合法
// 2024-02-29: 合法
// 2023-13-01: 不合法
?>

示例 6:计算未来日期

<?php
// 计算30天后的日期
$now = time();
$future = mktime(
    date("H", $now),
    date("i", $now),
    date("s", $now),
    date("m", $now),
    date("d", $now) + 30,  // 加30天
    date("Y", $now)
);

echo "当前时间:" . date("Y-m-d H:i:s", $now) . "<br>";
echo "30天后:" . date("Y-m-d H:i:s", $future);

// 输出类似:
// 当前时间:2023-08-15 10:30:45
// 30天后:2023-09-14 10:30:45
?>

示例 7:自动处理溢出值

<?php
// 分钟溢出
$timestamp1 = mktime(10, 90, 0, 1, 1, 2023);  // 90分钟 = 1小时30分钟
echo "10:90:00 2023-01-01 = " . date("Y-m-d H:i:s", $timestamp1);

echo "<br>";

// 小时溢出
$timestamp2 = mktime(25, 0, 0, 1, 1, 2023);  // 25小时 = 第二天1点
echo "25:00:00 2023-01-01 = " . date("Y-m-d H:i:s", $timestamp2);

echo "<br>";

// 日期溢出
$timestamp3 = mktime(0, 0, 0, 1, 32, 2023);  // 1月32日 = 2月1日
echo "2023-01-32 = " . date("Y-m-d", $timestamp3);

echo "<br>";

// 月份溢出
$timestamp4 = mktime(0, 0, 0, 13, 1, 2023);  // 13月 = 下一年1月
echo "2023-13-01 = " . date("Y-m-d", $timestamp4);

// 输出:
// 10:90:00 2023-01-01 = 2023-01-01 11:30:00
// 25:00:00 2023-01-01 = 2023-01-02 01:00:00
// 2023-01-32 = 2023-02-01
// 2023-13-01 = 2024-01-01
?>

示例 8:计算年龄

<?php
function calculateAge($birth_year, $birth_month, $birth_day) {
    $now = time();
    $birth = mktime(0, 0, 0, $birth_month, $birth_day, $birth_year);

    $age = date("Y", $now) - date("Y", $birth);

    // 如果生日还没到,减1岁
    if (mktime(0, 0, 0, date("m", $now), date("d", $now), date("Y", $now))
        < mktime(0, 0, 0, $birth_month, $birth_day, date("Y", $now))) {
        $age--;
    }

    return $age;
}

$age = calculateAge(1990, 8, 15);
echo "年龄:" . $age . "岁";

// 如果今天是2023-08-15,输出:年龄:33岁
// 如果今天是2023-08-14,输出:年龄:32岁
?>

注意事项

  • 从PHP 8.0.0开始,所有参数都是可选的,不传参数时返回当前时间的时间戳
  • 参数会自动处理溢出值,例如25小时会变成第二天的1小时
  • 两位数年份:0-69转换为2000-2069,70-99转换为1970-1999
  • 如果日期非法(如2月30日),函数返回 false
  • 对于PHP 5.1.0之前的版本,函数在无效日期上可能返回 -1
  • 推荐使用 strtotime()DateTime 类处理复杂日期计算

相关函数

  • time() - 返回当前时间的Unix时间戳
  • strtotime() - 将任何英文文本的日期时间描述解析为Unix时间戳
  • date() - 格式化本地时间/日期