← 返回首页 📖 工具指南

Unix 时间戳完全指南

发布日期:2026年6月18日 | 阅读时间:6分钟

时间戳是编程世界中最基础也最容易出错的概念之一。从数据库存储到 API 设计,从日志记录到缓存过期,时间戳无处不在。本文将深入浅出地讲解时间戳的一切。

什么是 Unix 时间戳?

Unix 时间戳是一个整数,表示从 1970年1月1日 00:00:00 UTC(Unix 纪元,Epoch)到某个时间点的总秒数。例如:

选择 1970 年作为起点并非随意——Unix 操作系统正是在 1969-1971 年间开发的,这个日期成为了事实标准。

秒 vs 毫秒:最常见的坑

这是开发中最容易搞混的问题。时间戳有两种常见精度:

精度长度示例使用场景
秒级10 位数字1719417600Unix 原生、MySQL TIMESTAMP、大部分 API
毫秒级13 位数字1719417600000JavaScript Date.now()、Java System.currentTimeMillis()

典型案例:当你从 JavaScript 获取 `Date.now()` 得到 1719417600000,直接传给一个期望秒级时间戳的 API,结果就会变成公元 56452 年的日期!所以在使用前一定要确认对方期望的是秒还是毫秒。

各编程语言中的时间戳处理

JavaScript

// 获取当前时间戳(毫秒)
const ms = Date.now();          // 1719417600000
const s = Math.floor(ms / 1000); // 1719417600

// 时间戳 → 日期对象
const date = new Date(ms);
console.log(date.toISOString()); // "2026-06-26T00:00:00.000Z"

// 日期 → 时间戳
const ts = new Date("2026-06-26").getTime();

Python

import time
from datetime import datetime

# 获取当前时间戳(秒,浮点数)
ts = time.time()  # 1719417600.123456

# 秒级整数
ts_int = int(ts)

# 时间戳 → datetime
dt = datetime.fromtimestamp(ts_int)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))

Go

import "time"

// 获取当前时间戳
sec := time.Now().Unix()      // 秒
msec := time.Now().UnixMilli() // 毫秒

// 时间戳 → Time
t := time.Unix(1719417600, 0)

MySQL

-- 当前时间戳
SELECT UNIX_TIMESTAMP();

-- 时间戳 → 日期
SELECT FROM_UNIXTIME(1719417600);
-- 结果: 2026-06-26 00:00:00

-- 日期 → 时间戳
SELECT UNIX_TIMESTAMP('2026-06-26 00:00:00');

著名的"2038 年问题"

这是一个真实存在的技术问题,和"千年虫"类似。在很多 32 位系统中,时间戳用有符号 32 位整数存储,最大值是 2^31 - 1 = 2147483647。这个值对应的时间是 2038年1月19日 03:14:07 UTC

超过这个时间点,32 位时间戳会溢出变成负数,相当于回到了 1901 年!这就是著名的 Year 2038 Problem(简称 Y2K38)。

解决方案:

好消息是 64 位时间戳的有效范围大约是 2920 亿年,远超宇宙的年龄,我们不需要再担心溢出问题。

ISO 8601:时间戳的可读替代方案

虽然时间戳在计算机之间传输很方便,但在 API 响应、日志文件、配置文件中,使用人类可读的时间格式更好:

// ❌ 不友好:这是什么时间?
"created_at": 1719417600

// ✅ 推荐:一眼就能看懂
"created_at": "2026-06-26T00:00:00Z"
"created_at": "2026-06-26T08:00:00+08:00"  // 带时区

ISO 8601 是全球标准的时间格式,建议在 JSON API 中使用。

实战:常见时间戳场景

1. API 接口中的时间格式选择

2. 数据库时间存储

3. 日志系统

日志中混用时间格式会严重影响问题排查。建议统一使用 ISO 8601 格式,并始终包含时区信息:

[2026-06-26T08:00:00+08:00] INFO  Request processed in 42ms
[2026-06-26T08:00:01+08:00] ERROR Database connection timeout

使用我们的时间戳转换工具

在线时间戳转换器支持:

立即体验使用时间戳转换器

本文最后更新于 2026年6月26日