时间戳转换完全指南:Unix时间戳与日期格式互转
10位和13位时间戳有什么区别?怎样快速把Unix时间戳转成北京时间、把日期转回时间戳?一文搞懂时间戳原理、时区换算与编程互转技巧。
做开发的同学一定遇到过这样的场景:接口返回一个 1719504000,老板问你这是几月几号;或者你需要把某个截止日期存进数据库,系统却要求填一串数字。这串数字就是时间戳(Timestamp),它是程序世界里最通用的时间表达方式。本文带你从头搞懂时间戳的原理、常见格式,以及如何快速转换。
什么是Unix时间戳?
Unix时间戳(Unix Timestamp)是从1970年1月1日 00:00:00 UTC(被称为 Unix Epoch)开始计算,到目标时刻所经过的总秒数。比如时间戳 0 对应的就是这个起点,而 1719504000 对应的是2024年6月27日 UTC+8 的20:00。
为什么选1970年?因为Unix系统在那个年代诞生,需要一个统一的时间起点。这个约定一直沿用至今,几乎所有操作系统、数据库和编程语言都以时间戳作为底层的时间表示。
时间戳最大的优势是统一、可比、无歧义:它只是一个整数,不受时区、日期格式、 daylight saving(夏令时)的影响,方便存储、排序和计算时间差。
10位秒级 vs 13位毫秒级:最常踩的坑
实际开发中你会遇到两种长度的时间戳,它们只是精度不同:
- 10位时间戳——以秒为单位,如
1719504000。常见于Unix/Linux系统、MySQL的FROM_UNIXTIME()函数、Python的time.time()(取整后)。 - 13位时间戳——以毫秒为单位,如
1719504000000。JavaScript的Date.now()、Java的System.currentTimeMillis()默认返回的就是毫秒级。
两者换算关系很简单:13位 = 10位 × 1000。排查时间戳问题时,第一步永远是看位数,判断精度。
时间戳与日期怎么互转?
手动换算时间戳到日期需要考虑时区,容易出错。最靠谱的方式是使用工具或编程语言内置函数。以下是几种常见语言的互转方法:
Python 互转示例
import time, datetime
# 时间戳 → 日期(北京时间)
ts = 1719504000
dt = datetime.datetime.fromtimestamp(ts)
print(dt) # 2024-06-27 20:00:00
# 日期 → 时间戳
dt = datetime.datetime(2024, 6, 27, 20, 0, 0)
ts = int(dt.timestamp())
print(ts) # 1719504000
JavaScript 互转示例
// 时间戳 → 日期字符串
const ts = 1719504000000; // 毫秒级
const date = new Date(ts);
console.log(date.toLocaleString('zh-CN'));
// 日期 → 时间戳
const ts = new Date('2024-06-27T20:00:00+08:00').getTime();
console.log(ts); // 1719504000000
MySQL 互转示例
-- 时间戳 → 日期
SELECT FROM_UNIXTIME(1719504000);
-- 结果: 2024-06-27 20:00:00
-- 日期 → 时间戳
SELECT UNIX_TIMESTAMP('2024-06-27 20:00:00');
-- 结果: 1719504000
时区换算:为什么同一个时间戳显示不同?
时间戳本身不带时区信息——它锚定的是 UTC 时间。同一个时间戳,在东京(UTC+9)显示的时间比北京(UTC+8)早1小时,比洛杉矶(UTC-8)晚16小时。核心公式:
当地时间 = UTC时间 + 时区偏移量
常见的时区偏移对照:
| 地区 | 时区 | 偏移量 |
|---|---|---|
| 北京 / 上海 | CST | UTC+8 |
| 东京 / 首尔 | JST / KST | UTC+9 |
| 伦敦 | GMT / BST | UTC+0 / +1(夏令时) |
| 纽约 | EST / EDT | UTC-5 / -4(夏令时) |
| 洛杉矶 | PST / PDT | UTC-8 / -7(夏令时) |
5iTool的时间戳工具默认输出北京时间(UTC+8),同时也显示UTC时间,方便对照。你不用手动做加减法。
常见问题(FAQ)
Q:10位时间戳和13位时间戳有什么区别?
10位时间戳以秒为单位,对应1970年1月1日到目标时间的秒数,主要用于Unix/Linux系统和后端数据库。13位时间戳以毫秒为单位,多用于JavaScript、Java等语言中需要更高精度的时间表示。换算关系很简单:13位时间戳 = 10位时间戳 × 1000。
Q:时间戳对应的时区是什么?怎么换算成北京时间?
Unix时间戳本身没有时区概念,它表示的是自1970年1月1日UTC零点以来经过的秒数。换算到不同时区时需要加上或减去对应的偏移量。北京时间是UTC+8,所以在UTC基准时间上再加8小时即可。5iTool的时间戳转换工具默认显示北京时间,无需手动计算。
Q:时间戳有最大值限制吗?2038年问题是什么?
32位系统上,有符号整数最大值约为21.4亿,对应到2038年1月19日03:14:07 UTC,这之后会发生溢出,称为2038年问题。现代64位系统的整数范围远超宇宙年龄,不存在此限制。大多数现代系统和编程语言已迁移到64位整数,无需担心。
Q:5iTool时间戳转换工具会保存我的数据吗?
不会。5iTool的时间戳转换工具完全在浏览器本地运行,所有转换计算都在你的设备上完成,不会将输入的时间戳或日期数据上传到服务器,隐私安全有保障。