PHP时间戳与UUID:版本1 UUID中时间戳的提取与解析

雪夜

雪夜

2026-05-29

948人浏览

原创

可行,需用 ramsey/uuid 的 generictimeconverter 将 uuid v1 的 60 位格里高利历时间戳(自1582-10-15起的100纳秒数)转换为 unix 时间戳,再构造 datetime;v7 更优,直接支持 getdatetime()。

php时间戳与uuid:版本1 uuid中时间戳的提取与解析

PHP 中从 UUID v1 提取真实创建时间是可行的,但必须手动处理格里高利历(1582-10-15)到 Unix 纪元(1970-01-01)的偏移转换——ramsey/uuid 提供了工具,但不会自动帮你把 Uuid 对象“变成” DateTime 实例。

UUID v1 时间戳在哪?60 位二进制值藏在 UUID 的第 6–15 字节

UUID v1 是 128 位固定长度,其中时间戳占 60 位,位于字节偏移 6–15(即字符串位置 12–31,十六进制表示)。它不是 Unix 时间戳,而是自 1582-10-15 00:00:00 UTC 起的 100 纳秒间隔数。直接用 strtotime()date() 解析 UUID 字符串会失败,因为那只是随机十六进制文本。

常见错误现象:

  • 把 UUID 字符串传给 strtotime('a1b2c3...') → 返回 false
  • 误以为 time() 和 UUID v1 时间戳单位一致 → 实际差 3 个数量级(秒 vs 100 纳秒)
  • 忽略时钟序列和节点 ID,只截取前 16 字符当“时间部分” → 结果完全不可信

用 ramsey/uuid 提取时间戳:关键靠 GenericTimeConverterconvertTime()

ramsey/uuidGenericTimeConverter 就是为这个场景设计的。它不依赖外部扩展,纯 PHP 实现,能正确处理大整数运算和纪元偏移。你需要先解析 UUID,再调用其 convertTime() 方法。

实操建议:

  • 确保安装的是 v4.7+ 版本(v4.6 及更早默认用 PhpTimeConverter,精度可能因浮点丢失)
  • 不要自己拼接字符串或用 substr() 截取时间字段 —— 必须用 Uuid::fromString() 获取完整对象,再调 getFields()->getTimeLow() 等方法获取原始字段
  • 推荐路径:$uuid = Uuid::fromString('...');$fields = $uuid->getFields();$converter = new GenericTimeConverter();$unixMicros = $converter->convertTime($fields->getTimestamp());
  • convertTime() 返回的是微秒级整数(不是秒),需除以 1_000_000 才能得到 DateTime 可用的 Unix 时间戳

手动还原成 DateTime:注意时区与纳秒精度损失

即使拿到正确的 Unix 秒数,也得小心 DateTime 构造方式。UUID v1 时间戳精度是 100 纳秒,而 PHP 的 DateTime 在 PHP 7.1+ 支持微秒(u 格式),但不支持纳秒。你最多能保留微秒级(丢弃最后一位 100 纳秒)。

PHP 8.5.5
PHP 8.5.5

PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。

下载

示例代码片段:

$unixSeconds = (int) floor($unixMicros / 1_000_000);
$microseconds = $unixMicros % 1_000_000;
$dt = DateTime::createFromFormat('U.u', $unixSeconds . '.' . str_pad((string) $microseconds, 6, '0', STR_PAD_LEFT));
$dt->setTimezone(new DateTimeZone('UTC'));

容易踩的坑:

  • 漏掉 setTimezone()DateTime 默认用本地时区解释时间戳,导致显示时间偏移
  • new DateTime('@' . $unixSeconds) → 会丢失微秒,且不设时区时行为不稳定
  • $unixMicros 直接传给 DateTime::createFromFormat('U.u', ...) → 它只接受字符串,且微秒必须是 6 位数字(不足补零)

v1 vs v7:别在新项目里硬扛 v1 的格里高利历转换

如果你只是需要“可排序 + 带时间”,强烈建议直接用 UUID v7:Uuid::uuid7() 生成的 UUID 时间戳基于 Unix 纪元、毫秒精度、无 MAC 地址泄露风险,且 getDateTime() 方法开箱即用。

对比关键点:

  • v1:必须走 GenericTimeConverter + 手动字段提取 + 纪元换算 → 多 3~4 步,易出错
  • v7:调 $uuid->getDateTime() 直接返回 DateTimeInterface 实例 → 单行解决
  • v7 不兼容旧系统假设(比如某些数据库索引已按 v1 字段结构建好),但新业务没理由继续用 v1
  • 注意:v7 要求 ramsey/uuid ≥ 4.7,且 PHP ≥ 8.0(因内部使用 random_bytes()pack() 精确控制字节序)

真正麻烦的从来不是“能不能做”,而是有人拿着 v1 UUID 去查日志,却忘了那个 122192928000000000 的常量——它藏在 GenericTimeConverter::GREGORIAN_TO_UNIX_INTERVALS 里,不是 magic number,但漏掉就全盘错。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

5528

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

3630

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

1808

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

2294

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

2831

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

2021

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

3075

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

2340

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

10931

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习