PHP 中的时间戳(Timestamp) 是指从「1970 年 1 月 1 日 00:00:00 UTC」(Unix 纪元)到指定时间的秒数(32 位系统最大支持到 2038 年,64 位无此限制),是处理时间的核心方式。以下是 PHP 中时间戳的核心用法、函数及常见场景:

一、获取当前时间戳

PHP 提供两种核心方式获取当前时间戳:

1. time() 函数(推荐)

返回当前 Unix 时间戳(秒级),无需参数,性能最优。

$timestamp = time();
echo $timestamp; // 输出:1734364800(示例值,实际为当前秒数)

2. microtime() 函数(微秒级)

返回包含秒 + 微秒的时间戳,适合高精度计时:

  • 无参数:返回字符串(如 0.123456 1734364800);
  • 传 true:返回浮点型(如 1734364800.123456)。
// 微秒级时间戳(浮点型)
$microTimestamp = microtime(true);
echo $microTimestamp; // 输出:1734364800.123456

// 拆分秒和微秒
list($micro, $sec) = explode(' ', microtime());
$timestamp = (float)$sec + (float)$micro;

 而类似1765878496000 是JS毫秒级时间戳(13 位),而 PHP 默认的时间戳是秒级(10 位),核心处理逻辑是「毫秒转秒」+「提取毫秒部分」,以下是针对 13 位毫秒时间戳的完整操作指南:

一、核心原理

13 位毫秒时间戳 = 10 位秒级时间戳 × 1000 + 剩余 3 位毫秒数例如:1765878496000 = 1765878496(秒) + 000(毫秒)

二、完整处理示例

1. 基础转换(毫秒转日期 + 提取毫秒)

// 第一步:设置时区(必做)
date_default_timezone_set('Asia/Shanghai');

// 第二步:定义13位毫秒时间戳
$msTimestamp = 1765878496000;

// 第三步:拆分秒级时间戳和毫秒
$timestamp = floor($msTimestamp / 1000); // 秒级:1765878496
$ms = $msTimestamp % 1000; // 毫秒:000(不足3位时补零,比如12→012)
$ms = str_pad($ms, 3, '0', STR_PAD_LEFT); // 确保毫秒是3位

// 第四步:转换为可读日期(带毫秒)
$date = date('Y-m-d H:i:s', $timestamp) . '.' . $ms;
echo $date; // 输出:2025-08-17 10:28:16.000(示例值,以实际计算为准)

2. 反向转换(日期转 13 位毫秒时间戳)

date_default_timezone_set('Asia/Shanghai');

// 目标日期(示例:2025-08-17 10:28:16)
$dateStr = '2025-08-17 10:28:16';
$ms = 123; // 自定义毫秒数(0-999)

// 步骤1:日期转秒级时间戳
$timestamp = strtotime($dateStr);

// 步骤2:转13位毫秒时间戳
$msTimestamp = $timestamp * 1000 + $ms;
echo $msTimestamp; // 输出:1765878496123

3. 用 DateTime 类处理(推荐,更优雅)

date_default_timezone_set('Asia/Shanghai');

$msTimestamp = 1765878496000;
$timestamp = floor($msTimestamp / 1000);
$ms = str_pad($msTimestamp % 1000, 3, '0', STR_PAD_LEFT);

// DateTime 方式转换
$dateObj = new DateTime();
$dateObj->setTimestamp($timestamp);
$date = $dateObj->format('Y-m-d H:i:s') . '.' . $ms;
echo $date; // 同样输出带毫秒的日期

三、常见问题解决

1. 毫秒数补零问题

如果毫秒部分不足 3 位(比如时间戳是 176587849612,即毫秒是 12),直接取余会得到12,需要补零为012,否则格式不规范:

$msTimestamp = 176587849612; // 注意:这里是12位(少1位),实际是1765878496012的简写
$ms = $msTimestamp % 1000; // 12
$ms = str_pad($ms, 3, '0', STR_PAD_LEFT); // 012

2. 前端传参的毫秒时间戳(字符串类型)

如果前端传的是字符串格式的 13 位数字(如 '1765878496000'),先转成整数再处理:

$msTimestampStr = '1765878496000';
$msTimestamp = (int)$msTimestampStr; // 转整数
// 后续处理同上

3. 计算两个毫秒时间戳的间隔

$msStart = 1765878496000;
$msEnd = 1765878556123;

// 计算间隔(毫秒)
$diffMs = $msEnd - $msStart;
// 转换为:分钟.秒.毫秒
$diffMin = floor($diffMs / 60000); // 分钟
$diffSec = floor(($diffMs % 60000) / 1000); // 秒
$diffMsFinal = $diffMs % 1000; // 剩余毫秒

echo "间隔:{$diffMin} 分 {$diffSec} 秒 {$diffMsFinal} 毫秒";

四、封装成工具函数(直接复用)

/**
 * 13位毫秒时间戳转日期字符串(带毫秒)
 * @param int $msTimestamp 13位毫秒时间戳
 * @param string $format 日期格式,默认Y-m-d H:i:s
 * @return string 带毫秒的日期,如:2025-08-17 10:28:16.000
 */
function msTimestampToDate($msTimestamp, $format = 'Y-m-d H:i:s') {
    date_default_timezone_set('Asia/Shanghai');
    $timestamp = floor($msTimestamp / 1000);
    $ms = str_pad($msTimestamp % 1000, 3, '0', STR_PAD_LEFT);
    return date($format, $timestamp) . '.' . $ms;
}

/**
 * 日期字符串转13位毫秒时间戳
 * @param string $dateStr 日期字符串,如:2025-08-17 10:28:16
 * @param int $ms 毫秒数(0-999),默认0
 * @return int 13位毫秒时间戳
 */
function dateToMsTimestamp($dateStr, $ms = 0) {
    date_default_timezone_set('Asia/Shanghai');
    $timestamp = strtotime($dateStr);
    return $timestamp * 1000 + $ms;
}

// 调用示例
echo msTimestampToDate(1765878496000); // 2025-08-17 10:28:16.000
echo dateToMsTimestamp('2025-08-17 10:28:16', 123); // 1765878496123