Skip to content

时间戳转换器

Unix 时间戳和可读日期之间即时转换——还支持 Windows FILETIME.NET TicksLDAP/ADChrome WebKitExcel OADate。粘贴任意值即可自动检测格式,支持一键复制。

转换器

实时 Unix 时间戳
0
毫秒0

时间戳 → 日期

日期 → 时间戳

什么是 Unix 时间戳?

Unix 时间戳(也称 Unix 纪元时间POSIX 时间)是指自 1970-01-01 00:00:00 UTC(Unix 纪元)以来经过的秒数。这是编程中表示时间点最常见的方式。

例如,1700000000 对应 2023 年 11 月 14 日 22:13:20 UTC

Unix 时间戳的特点:

  • 与时区无关 — 始终以 UTC 为基准
  • 连续 — 大多数实现中不包含闰秒
  • 紧凑 — 一个整数即可表示完整日期

秒与毫秒

Unix 时间戳有两种常见精度:

毫秒
示例17000000001700000000000
精度1 秒1 毫秒
使用者Unix/Linux API、大多数数据库JavaScript(Date.now())、Java、日志系统
位数约 10 位约 13 位

如何区分: 如果数字有 13 位或更多,就是毫秒。本转换器会自动检测精度——只需粘贴数字即可。

常见使用场景

  • 调试日志 — 将服务器日志中的时间戳转换为可读时间以追踪事件
  • API 集成 — 许多 REST API 使用 Unix 时间戳作为日期字段
  • 数据库查询 — 使用纪元值按时间范围查询记录
  • 调度 — 使用时间戳算术计算延迟或安排未来事件
  • UUID v7 — UUID v7 的前 48 位嵌入了毫秒级 Unix 时间戳;解码它即可查看 UUID 的创建时间
  • Active Directory 管理 — 将 lastLogonpwdLastSetaccountExpires 等 LDAP 时间戳转换为可读日期,用于用户审计
  • Excel / Office 自动化 — 在与电子表格及 DateTime.FromOADate 互操作时解码 OADate 序列号
  • Chrome 取证 — 读取 HistoryCookies 的 SQLite WebKit 时间戳,用于调试或数字取证

什么是 Windows FILETIME?

Windows FILETIME 是一个 64 位值,计算自 1601-01-01 00:00:00 UTC 起的 100 纳秒间隔数。它是 Win32 API、NTFS 文件系统和 COM/OLE 的原生时间格式。

FILETIME 结构体将值存储为两个 32 位 DWORD:dwLowDateTimedwHighDateTime。你会在 GetFileTime()CoFileTimeNow() 以及 NTFS 主文件表(MFT)记录中遇到它。

转换公式:

unix_seconds = (filetime / 10000000) - 11644473600

例如,1335927553562300002024-05-04 04:32:15 UTC。本转换器会自动将低于 ~3 × 10¹⁷ 的 18 位数值检测为 FILETIME。

什么是 .NET DateTime Ticks?

.NET Ticks 是一个 64 位有符号整数,计算自 0001-01-01 00:00:00 UTC(公元 1 年)起的 100 纳秒间隔数。它是 C#/.NET 中 DateTime 的底层存储,可通过 DateTime.Now.Ticks 访问。

其范围覆盖 0001-01-019999-12-31,单个 long 值最大约为 3.16 × 10¹⁸。与 FILETIME(基于 1601 年)不同,.NET ticks 从公元 1 年开始,以避免负值并简化日历运算。

例如,638514336000000000 ticks → 2024-05-16 00:00:00 UTC。大于等于 ~3 × 10¹⁷ 的值会被检测为 .NET ticks;低于该阈值则更可能是 FILETIME。

什么是 LDAP / Active Directory 时间戳?

LDAP 时间戳(Microsoft Active Directory 使用)在数值上与 FILETIME 完全相同——都是自 1601-01-01 UTC 起的 100 纳秒间隔。区别仅在于使用场景:lastLogonlastLogonTimestamppwdLastSetaccountExpires 等 AD 属性在 LDAP 架构下存储 FILETIME 值。

AD 管理员经常需要转换这些值来审计用户活动和密码过期。在 PowerShell 中:

powershell
[DateTime]::FromFileTime($value).ToString('yyyy-MM-dd HH:mm:ss')

例如,1325145600000000002020-12-03 00:00:00 UTCaccountExpires9223372036854775807Int64.MaxValue)表示"永不过期"。

什么是 Chrome / WebKit 时间戳?

Chrome 和 WebKit 时间戳计算的是自 1601-01-01 UTC 起的微秒数(不是 100 纳秒)。它们出现在 Chrome 的 HistoryCookiesLogin Data SQLite 数据库中——对调试、取证和数据恢复很有用。

由于单位是 μs(不是 100ns),同一时刻的值比 FILETIME 小 10 倍。当前时代的值通常是 17 位(约 1.3 × 10¹⁶)。

用 SQL 查询 Chrome 历史记录:

sql
SELECT datetime(time / 1000000 - 11644473600, 'unixepoch') AS visit_time
FROM urls ORDER BY visit_time DESC LIMIT 10;

例如,133176960000000002023-01-09 00:00:00 UTC

什么是 Microsoft OADate / Excel 序列号?

OADate(OLE Automation Date)是一个 double,计算自 1899-12-30 起的天数。小数部分表示一天中的时间(0.5 = 正午)。Excel、Google Sheets 和 Office 自动化内部都使用这种序列格式。

为什么是 1899-12-30 而不是 1900-01-01?Excel 有意重现了一个 1900 年闰年 bug(1900 年并非闰年,但 Lotus 1-2-3 把它当作闰年处理)。将纪元往回移两天可以保持 Excel 日期与该历史 bug 的兼容性。

例如,45678.52025-01-21 12:00:00。在 C# 中:DateTime.FromOADate(45678.5)。在 Excel 中:=DATE(2025,1,21) 返回 45678

常见问题

什么是 2038 年问题? 32 位有符号整数的 Unix 时间戳最大值为 2147483647(2038 年 1 月 19 日 03:14:07 UTC)。仍在使用 32 位 time_t 的系统将会溢出。大多数现代系统已迁移到 64 位时间戳,在 2920 亿年内不会溢出。

此工具如何处理时区? Unix 时间戳本质上是 UTC。本转换器同时显示 UTC 表示和浏览器的本地时区,让您始终获得两种视角。

可以使用负时间戳吗? 可以。负的 Unix 时间戳表示纪元(1970-01-01 00:00:00 UTC)之前的日期。例如,-86400 是 1969 年 12 月 31 日 00:00:00 UTC — 恰好在纪元前一天。

FILETIME 和 LDAP 时间戳有什么区别? 在数值上完全相同——都是自 1601-01-01 UTC 起的 100 纳秒间隔。"FILETIME"是 Win32/COM 的名称;"LDAP 时间戳"指的是存储在 lastLogon 等 Active Directory 属性中的同一个值。两者使用相同的转换公式。

为什么 .NET DateTime Ticks 从公元 1 年开始? .NET 的日历从 0001-01-01(公历的习惯起点)开始,这样所有有效日期都会产生正的 tick 值。这避免了 FILETIME 的 1601 纪元可能带来的符号处理复杂性,并简化了 0001–9999 全范围的日期运算。

为什么 OADate 纪元是 1899 年 12 月 30 日? Excel 从 Lotus 1-2-3 继承了一个 bug,把 1900 年当作闰年处理(实际上不是)。为了让 1900 年 3 月 1 日这样的日期在 Excel 和现实中保持一致,OLE Automation 纪元被设为 1899-12-30——比名义上的"1900 年 1 月 1 日"早两天,以补偿虚构的 1900 年 2 月 29 日。