时间戳转换完全指南

全面介绍Unix时间戳的概念、转换方法和实际应用场景。包含JavaScript、Python、Java等多语言时间戳转换代码示例。

日期时间 2026-05-27 10 分钟

时间戳转换完全指南

时间戳(Timestamp)是计算机系统中表示时间的核心方式。无论是在数据库存储、API接口开发,还是日志分析中,时间戳都扮演着重要角色。本文将全面介绍时间戳的概念、转换方法和最佳实践。

什么是时间戳?

Unix时间戳(Unix Timestamp)是指从 1970年1月1日 00:00:00 UTC 起到现在的总秒数。这个起始时间被称为"Unix纪元"(Unix Epoch)。

例如:

  • 0 → 1970-01-01 08:00:00(北京时间,UTC+8)
  • 1700000000 → 2023-11-14 22:13:20(北京时间)
  • 1748400000 → 2025-05-28 08:00:00(北京时间)

时间戳是一个整数,不包含时区信息,因此在任何地方都是统一的。

为什么使用时间戳?

1. 时区无关性

时间戳是绝对时间的数值表示,不受时区影响。同一个时间戳在任何时区转换为本地时间后都是正确的。

2. 存储效率

存储一个整数比存储日期字符串更节省空间。在数据库中,INT 类型只需要 4 字节,而 DATETIME 类型需要 8 字节。

3. 计算方便

两个时间戳相减可以直接得到时间差(秒数),非常适合做时间间隔计算。

4. 排序和比较

整数比较比日期字符串比较更快、更可靠。

时间戳单位:秒 vs 毫秒

需要注意的是,不同语言和系统使用的时间戳单位不同:

单位 位数 示例 使用场景
秒(seconds) 10位 1700000000 Unix/Linux、Python、PHP
毫秒(milliseconds) 13位 1700000000000 JavaScript、Java

在使用 jsjson 时间戳转换工具 时,工具会自动识别是秒还是毫秒格式。

各语言时间戳转换

JavaScript

// 获取当前时间戳(毫秒)
const timestamp = Date.now()  // 1700000000000

// 获取当前时间戳(秒)
const timestampSec = Math.floor(Date.now() / 1000)  // 1700000000

// 时间戳转日期
const date = new Date(1700000000 * 1000)
console.log(date.toLocaleString('zh-CN'))
// 输出: 2023/11/14 22:13:20

// 日期转时间戳
const ts = new Date('2023-11-14 22:13:20').getTime() / 1000

Python

import time
from datetime import datetime

# 获取当前时间戳(秒)
timestamp = int(time.time())  # 1700000000

# 时间戳转日期
dt = datetime.fromtimestamp(1700000000)
print(dt.strftime('%Y-%m-%d %H:%M:%S'))
# 输出: 2023-11-14 22:13:20

# 日期转时间戳
ts = int(datetime(2023, 11, 14, 22, 13, 20).timestamp())

Java

// 获取当前时间戳(毫秒)
long timestamp = System.currentTimeMillis();

// 时间戳转日期
Instant instant = Instant.ofEpochSecond(1700000000);
LocalDateTime dt = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
System.out.println(dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

// 日期转时间戳
long ts = LocalDateTime.now().atZone(ZoneId.of("Asia/Shanghai"))
    .toInstant().getEpochSecond();

Go

import (
    "fmt"
    "time"
)

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

// 时间戳转日期
t := time.Unix(1700000000, 0)
fmt.Println(t.Format("2006-01-02 15:04:05"))

// 日期转时间戳
t, _ := time.Parse("2006-01-02 15:04:05", "2023-11-14 22:13:20")
ts := t.Unix()

常见应用场景

1. API 接口开发

RESTful API 通常使用时间戳作为时间字段的标准格式,避免日期格式解析问题:

{
  "created_at": 1700000000,
  "updated_at": 1700003600
}

2. 数据库存储

MySQL 中可以使用 UNIX_TIMESTAMP()FROM_UNIXTIME() 函数:

-- 插入当前时间戳
INSERT INTO logs (message, created_at) VALUES ('test', UNIX_TIMESTAMP());

-- 查询时转换为日期
SELECT message, FROM_UNIXTIME(created_at) FROM logs;

3. 缓存过期判断

const CACHE_TTL = 3600  // 1小时
const cachedAt = 1700000000

if (Math.floor(Date.now() / 1000) - cachedAt > CACHE_TTL) {
  // 缓存过期,重新获取
}

4. 日志分析

服务器日志通常记录时间戳,便于排序和过滤:

# 查找特定时间段的日志
awk -v start=1700000000 -v end=1700003600 '$1 >= start && $1 <= end' server.log

常见问题

Q: 为什么我的时间戳转换结果差8小时?

A: 这是时区问题。Unix时间戳基于UTC,转换为本地时间时需要加上时区偏移。北京时间是UTC+8,所以会差8小时。使用 jsjson时间戳工具 会自动处理时区转换。

Q: 2038年问题是什么?

A: 32位有符号整数能表示的最大时间戳是 2147483647,对应 2038-01-19 03:14:07 UTC。超过这个时间会溢出。现代系统已普遍使用64位整数,这个问题正在逐步解决。

Q: 如何处理毫秒和秒的转换?

A: 毫秒转秒除以1000,秒转毫秒乘以1000。判断方法:13位数字是毫秒,10位数字是秒。

Q: 数据库应该用时间戳还是DATETIME?

A: 各有优劣。时间戳存储更小、比较更快,但不直观;DATETIME可读性好,但占用更多空间。建议在需要频繁计算时间差的场景使用时间戳,在需要直接查看的场景使用DATETIME。

总结

时间戳是开发中不可或缺的基础知识。掌握时间戳的转换方法和使用场景,能够帮助你更高效地处理时间相关的开发任务。推荐使用 jsjson.com 在线时间戳转换工具,支持秒/毫秒自动识别、时区转换、批量转换等功能。


本文最后更新于 2026 年 5 月

📚 相关文章