时间戳转日期时间
日期转时间戳
各编程语言时间戳操作示例
// 获取当前时间戳(毫秒)
const millis = Date.now(); // 13位,例如:1704067200000
const seconds = Math.floor(Date.now() / 1000); // 10位,例如:1704067200
// 时间戳转日期
const date = new Date(1704067200000);
console.log(date.toLocaleString('zh-CN')); // 2024/1/1 08:00:00
// 日期转时间戳
const ts = new Date('2024-01-01T00:00:00').getTime();
console.log(ts); // 1704067200000
import time
from datetime import datetime
# 获取当前时间戳
seconds = time.time() # 10位秒级:1704067200.0
millis = int(time.time() * 1000) # 13位毫秒级
# 时间戳转日期(本地时间)
local_time = time.localtime(1704067200)
formatted = time.strftime('%Y-%m-%d %H:%M:%S', local_time)
print(formatted) # 2024-01-01 08:00:00
# 日期转时间戳
dt = datetime.strptime('2024-01-01 08:00:00', '%Y-%m-%d %H:%M:%S')
ts = int(dt.timestamp())
print(ts) # 1704067200
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
// 获取当前时间戳
long millis = System.currentTimeMillis(); // 13位
long seconds = Instant.now().getEpochSecond(); // 10位
// 时间戳转日期
String formatted = Instant.ofEpochMilli(1704067200000L)
.atZone(ZoneId.of("Asia/Shanghai"))
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 结果:2024-01-01 08:00:00
// 日期转时间戳
long ts = Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
package main
import (
"fmt"
"time"
)
func main() {
// 获取当前时间戳
millis := time.Now().UnixMilli() // 13位
seconds := time.Now().Unix() // 10位
// 时间戳转日期
t := time.Unix(1704067200, 0)
fmt.Println(t.Format("2006-01-02 15:04:05"))
// 输出:2024-01-01 08:00:00
// 日期转时间戳
loc, _ := time.LoadLocation("Asia/Shanghai")
dt, _ := time.ParseInLocation("2006-01-02 15:04:05", "2024-01-01 08:00:00", loc)
fmt.Println(dt.Unix()) // 1704067200
}
<?php
// 获取当前时间戳
$seconds = time(); // 10位秒级
$millis = round(microtime(true) * 1000); // 13位毫秒级
// 时间戳转日期
$date = date('Y-m-d H:i:s', 1704067200);
echo $date; // 2024-01-01 08:00:00
// 日期转时间戳
$ts = strtotime('2024-01-01 08:00:00');
echo $ts; // 1704067200
// DateTime 方式(推荐)
$dt = new DateTime('2024-01-01 08:00:00', new DateTimeZone('Asia/Shanghai'));
echo $dt->getTimestamp(); // 1704067200
?>
using System;
// 获取当前时间戳
long millis = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 13位
long seconds = DateTimeOffset.Now.ToUnixTimeSeconds(); // 10位
// 时间戳转日期
DateTime date = DateTimeOffset.FromUnixTimeSeconds(1704067200)
.LocalDateTime;
Console.WriteLine(date.ToString("yyyy-MM-dd HH:mm:ss"));
// 输出:2024-01-01 08:00:00
// 日期转时间戳
DateTime dt = new DateTime(2024, 1, 1, 8, 0, 0, DateTimeKind.Local);
long ts = new DateTimeOffset(dt).ToUnixTimeSeconds();
Console.WriteLine(ts); // 1704067200
# 获取当前时间戳
date +%s # 10位秒级:1704067200
date +%s%3N # 13位毫秒级:1704067200000
# 时间戳转日期(Linux/macOS)
date -d @1704067200 '+%Y-%m-%d %H:%M:%S' # GNU date
date -r 1704067200 '+%Y-%m-%d %H:%M:%S' # macOS date
# 输出:2024-01-01 08:00:00
# 日期转时间戳
date -d '2024-01-01 08:00:00' +%s # GNU date
date -j -f '%Y-%m-%d %H:%M:%S' '2024-01-01 08:00:00' +%s # macOS
什么是 Unix 时间戳?
Unix 时间戳(Unix Timestamp)是一种将特定时间点转换为纯数字的表示方式,便于计算机存储、计算和跨系统交换。最常见的 Unix 时间戳以1970年1月1日00:00:00 UTC(协调世界时)为起点,计算从该时刻到目标时间所经过的秒数或毫秒数。
例如,时间戳 1704067200 表示从 Unix 纪元起经过了约17亿零406万7千2百秒,对应北京时间 2024年1月1日 08:00:00。由于采用纯数字表示,时间戳天然具备跨时区、跨平台、格式统一的优点,不会因为地区或语言差异而产生歧义,是全球开发者公认的标准时间表示法。
在编程开发、数据库设计、API 接口、日志分析和缓存系统中,时间戳是最常用的时间存储格式。无论是 JavaScript 的 Date.now()、Python 的 time.time()、Java 的 System.currentTimeMillis(),还是 MySQL 的 UNIX_TIMESTAMP(),底层都遵循同样的计算逻辑。掌握时间戳的转换与计算,是每一位开发者、运维工程师和数据分析师的基础技能。
本工具支持10位秒级与13位毫秒级时间戳的自动识别与转换。输入任意位数即可正确解析,无需手动选择格式。
10位时间戳与13位时间戳的详细对比
很多开发者在处理时间戳时,都会遇到10位和13位数字的困惑。其实两者的区别非常简单,核心差异仅在于时间精度单位不同。以下是详细对比:
| 对比项 | 10位时间戳(秒级) | 13位时间戳(毫秒级) |
|---|---|---|
| 单位 | 秒(s) | 毫秒(ms) |
| 精度 | 精确到秒 | 精确到毫秒(1/1000秒) |
| 换算关系 | 13位 ÷ 1000 = 10位 | 10位 × 1000 = 13位 | |
| 典型使用场景 | 服务器端开发、Linux命令、数据库存储、API标准字段 | 前端JavaScript、动画帧率、接口耗时统计、高并发订单号 |
| 常用函数 | time.time()、time()、Instant.getEpochSecond() | Date.now()、System.currentTimeMillis()、time.Now().UnixMilli() |
| 示例值 | 1704067200 | 1704067200000 |
如何选择使用哪种格式?
在实际开发中,选择10位还是13位时间戳取决于业务场景对时间精度的要求:
- 记录用户操作时间、文章发布时间、订单创建时间等对秒级精度已足够的场景,推荐使用10位秒级时间戳。它在数据库存储中更省空间(INT vs BIGINT),索引效率更高,且与大多数后端框架和Linux工具链兼容最好。
- 前端动画计时、接口响应耗时测量、日志排序、高并发唯一ID生成等对毫秒甚至微秒精度有要求的场景,推荐使用13位毫秒级时间戳。JavaScript 的
Date.now()默认返回此格式,无需额外转换。 - 跨系统数据交换时,建议前后端约定统一格式,或在 API 文档中明确标注字段单位为秒或毫秒,避免因单位误解导致时间偏差1000倍。
注意:部分老旧系统或32位环境使用有符号32位整数存储秒级时间戳,将在2038年1月19日发生溢出(Year 2038问题)。现代系统已普遍迁移至64位存储,可安全使用到数亿年之后。
时间戳的典型应用场景
时间戳虽然看起来只是一串数字,但在互联网和软件开发中几乎无处不在。以下是经过实际项目验证的最典型应用场景:
- 编程开发与调试:JavaScript、Python、Java、Go、PHP 等语言中常用时间戳进行时间计算、排序和比较。例如判断 JWT Token 是否过期、计算倒计时、生成按时间排序的唯一 ID 等。前后端联调时,接口返回13位毫秒时间戳,开发人员需要快速转换为可读日期进行验证,这正是本工具的核心用途之一。
- 数据库设计与优化:MySQL、PostgreSQL、MongoDB 等数据库常用
INT(10位)或BIGINT(13位)类型存储时间戳,比DATETIME字符串更省存储空间、索引效率更高、时区处理更简单。在进行时间范围查询时,数值比较也比字符串解析更快。 - RESTful API 与微服务通信:RESTful API 和微服务之间传输时间数据时,通常使用时间戳而非格式化字符串,避免前端和后端因时区解析不一致导致错误。例如 OAuth2 Token 的
exp(过期时间)字段、日志中的timestamp字段均采用时间戳格式。 - 服务器日志与监控分析:Nginx、Apache、应用日志中的时间戳便于按时间排序、筛选和聚合。ELK Stack(Elasticsearch, Logstash, Kibana)、Grafana、Prometheus 等监控工具也基于时间戳进行数据对齐、时序图表展示和告警触发。
- 缓存策略与 Token 过期控制:Redis 缓存的 TTL(生存时间)、JWT Token 的
exp字段、Cookie 的Expires属性、短信验证码的有效期,本质上都是基于当前时间戳与目标时间戳的数值比较来实现过期判断。 - 版本控制与数据同步:在增量数据同步场景中,使用时间戳作为游标(cursor)可以精确获取某时间点之后变更的数据,避免全量拉取。例如数据库 binlog 同步、消息队列消费位点、文件增量备份等。
Unix 纪元(Epoch)与时区处理详解
Unix 纪元(Unix Epoch)是指1970年1月1日00:00:00 UTC,这是所有 Unix 时间戳计算的起点,也就是时间戳为 0 的时刻。选择这个日期作为起点,是因为 Unix 操作系统在1970年代初期由贝尔实验室开发时,需要一个统一且足够早的基准时间,而1970年1月1日恰好是一个周四,便于计算周数。
需要注意的是,Unix 纪元的基准是 UTC 时间(协调世界时,Coordinated Universal Time),而非北京时间。北京时间属于东八区(UTC+8),比 UTC 快8个小时。因此同一个时间戳在不同地区显示的结果不同:
- UTC 时间:1970年1月1日 00:00:00 → 时间戳为 0
- 北京时间(UTC+8):1970年1月1日 08:00:00 → 时间戳同样为 0
- 纽约时间(UTC-5/UTC-4):1969年12月31日 19:00:00 → 时间戳同样为 0
本工具的转换结果默认显示为北京时间(UTC+8),这也是中国开发者最常用的本地时间格式。如果你的服务器或数据库使用 UTC 存储,转换后需要自行减去8小时得到 UTC 时间,或在代码中显式指定时区进行转换。
在国际化应用中,最佳实践是存储使用 UTC 时间戳,显示根据用户时区本地化。这样可以避免夏令时(DST)切换、时区变更等带来的复杂问题。JavaScript 的 toLocaleString()、Python 的 pytz 库、Java 的 ZoneId 都提供了完善的时区转换支持。
使用说明与隐私保障
本工具完全免费,所有计算均在浏览器本地完成,不会上传任何数据到服务器,可放心在本地开发环境或生产服务器上使用。具体操作步骤如下:
- 页面顶部实时显示当前北京时间和对应的 Unix 时间戳(秒级与毫秒级),每秒自动更新,方便你直接复制使用。
- 在左侧「时间戳 → 日期」区域输入时间戳数字,支持10位(秒)和13位(毫秒)自动识别,点击「转换」即可得到标准日期时间。支持按 Enter 键快速转换。
- 点击「粘贴并转换」可自动读取剪贴板内容并执行转换,省去手动粘贴步骤,提升开发效率。
- 在右侧「日期 → 时间戳」区域选择日期时间,可在下拉框中选择输出秒级(10位)或毫秒级(13位)格式。
- 点击「使用当前时间」可快速填入此刻的日期时间,方便生成当前时间戳用于测试或记录。
- 转换结果支持一键复制,点击「复制结果」按钮即可写入剪贴板,方便粘贴到代码编辑器、终端或文档中。
- 中间代码示例区提供 JavaScript、Python、Java、Go、PHP、C#、Bash 七种主流语言的时间戳操作代码,点击标签即可切换,可直接复制到项目中使用。
隐私承诺:所有时间转换计算均在您的浏览器本地完成,不会上传任何数据到服务器,不会记录您的输入内容,可放心使用。
常见问题解答(FAQ)
什么是 Unix 时间戳? ▼
Unix 时间戳(Unix Timestamp)是一种将特定时间点转换为数字的表示方式,以1970年1月1日00:00:00 UTC为起点,计算从该时刻到目标时间所经过的秒数或毫秒数。10位数字表示秒级精度,13位数字表示毫秒级精度,广泛应用于编程开发、数据库记录和API接口中。
10位时间戳和13位时间戳有什么区别? ▼
10位时间戳以秒为单位,是传统 Unix 时间戳标准格式,在服务器端开发、Linux系统命令、数据库标准函数中最为常见;13位时间戳以毫秒为单位,是 JavaScript 等现代前端开发的默认格式,Date.now()返回的就是13位毫秒时间戳。两者相差1000倍,13位时间戳末尾三位为毫秒精度。本工具支持两种格式自动识别与转换。
时间戳怎么计算? ▼
时间戳的计算以1970年1月1日00:00:00 UTC为起点(Unix纪元)。计算目标时间与该起点之间的时间差,以秒为单位得到10位时间戳,以毫秒为单位得到13位时间戳。例如2024年1月1日0点0分0秒UTC对应的秒级时间戳为1704067200,毫秒级为1704067200000。
JavaScript 如何获取当前时间戳? ▼
JavaScript 获取当前时间戳有三种常用方式:Date.now() 返回13位毫秒时间戳;new Date().getTime() 同样返回毫秒时间戳;Math.floor(Date.now()/1000) 可得到10位秒级时间戳。在 Node.js 环境中也可以使用 process.hrtime.bigint() 获取更高精度的时间。
Python 如何转换时间戳与日期? ▼
Python 中使用 time 模块:time.time() 获取当前秒级时间戳;time.localtime(ts) 将时间戳转为本地时间元组;time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(ts)) 格式化输出。datetime 模块更灵活:datetime.datetime.fromtimestamp(ts) 直接转为 datetime 对象,支持时区处理。
Unix 时间戳的0代表什么? ▼
Unix 时间戳的0表示1970年1月1日00:00:00 UTC,这个时刻被称为 Unix 纪元(Unix Epoch),是所有 Unix 时间戳计算的起点。在北京时间(UTC+8)中,这个时间对应1970年1月1日08:00:00。
时间戳会溢出吗?Year 2038 问题是什么? ▼
32位有符号整数存储的秒级时间戳将在2038年1月19日03:14:07 UTC发生溢出(Year 2038问题),回滚到1901年。这是因为32位有符号整数的最大值为2,147,483,647。现代系统已普遍采用64位整数存储,可表示到数亿年之后,因此实际应用中无需担心溢出问题。但维护老旧32位嵌入式设备或数据库时仍需注意。
相关工具与扩展阅读
时间戳转换只是开发工作中时间处理的一部分。如果你还需要以下功能,可以参考对应的解决方案:
- 时区转换:当项目涉及多时区用户时,建议使用 Moment.js(遗留项目)、Day.js 或 date-fns 等现代日期库处理时区转换,避免原生 Date 对象的时区陷阱。
- ISO 8601 格式:API 接口中除了时间戳,也常使用 ISO 8601 标准格式(如 2024-01-01T08:00:00+08:00)。该格式包含时区信息,可读性好,是 JSON 数据传输的推荐格式。
- Cron 表达式:定时任务场景中,配合时间戳使用 Cron 表达式可以精确控制任务执行周期。推荐在线 Cron 生成器辅助编写。
- 性能计时:需要测量代码执行耗时(精度要求高于毫秒)时,浏览器环境可使用 performance.now(),Node.js 可使用 process.hrtime.bigint()。
本工具持续更新维护,确保时间计算逻辑准确无误。如果你发现任何问题或有功能建议,欢迎通过页面底部链接反馈。
最新博客
JavaScript 日期与时间戳转换的 5 种方法及最佳实践
详解 JavaScript 中 Date.now()、getTime()、valueOf() 等 5 种获取时间戳的方法差异,讲解时区处理陷阱与最佳实践,附带可直接复用的工具函数代码。
Unix 时间戳完全指南:从 Epoch 到毫秒精度的演进
深入解析 Unix 时间戳的起源与计算原理,包括 Epoch 纪元定义、10位秒级与13位毫秒级的区别、32位时间戳的2038年溢出问题,以及现代开发中为什么更推荐使用毫秒级时间戳。