TimeCraft

Millisecond Timestamp

毫秒时间戳转换教程

深入了解13位毫秒级时间戳的转换方法,包含各编程语言的实现代码。

当前毫秒时间戳
0
秒级时间戳:0

应用场景

日志记录

记录精确到毫秒的事件发生时间,便于问题排查和性能分析

2025-01-01T00:00:00.123Z → 1735660800123

性能测试

测量代码执行时间,毫秒级精度可以更准确地评估性能

耗时: 123ms

API签名

防止重放攻击,API请求需要包含精确的时间戳

timestamp=1735660800123&sign=xxx

数据同步

增量同步数据时,使用毫秒时间戳标记数据变更时间

WHERE updated_at > 1735660800123

什么是毫秒时间戳?

text
毫秒时间戳是Unix时间戳的毫秒级精度版本:

秒级时间戳(10位):1735660800
毫秒级时间戳(13位):1735660800000

换算关系:
毫秒时间戳 = 秒时间戳 × 1000
秒时间戳 = Math.floor(毫秒时间戳 ÷ 1000)

为什么使用毫秒时间戳?
1. 更高的时间精度,适合需要精确到毫秒的场景
2. JavaScript、Java等语言默认使用毫秒
3. 日志记录、性能测试等需要精确时间

JavaScript 毫秒时间戳

JavaScript
// 获取当前毫秒时间戳
const ms = Date.now();
console.log(ms);  // 1735660800000

// 或使用 new Date()
const ms2 = new Date().getTime();
const ms3 = new Date().valueOf();

// 毫秒时间戳转日期
const date = new Date(1735660800000);
console.log(date.toLocaleString());  // 2025/1/1 00:00:00

// 日期转毫秒时间戳
const ms4 = new Date('2025-01-01 00:00:00').getTime();
console.log(ms4);  // 1735660800000

// 毫秒时间戳转秒时间戳
const sec = Math.floor(Date.now() / 1000);

// 秒时间戳转毫秒时间戳
const msFromSec = sec * 1000;

Python 毫秒时间戳

Python
import time
from datetime import datetime

# 获取当前毫秒时间戳
ms = int(time.time() * 1000)
print(ms)  # 1735660800000

# 毫秒时间戳转日期
timestamp_ms = 1735660800000
date = datetime.fromtimestamp(timestamp_ms / 1000)
print(date.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])

# 日期转毫秒时间戳
dt = datetime(2025, 1, 1, 0, 0, 0)
ms = int(dt.timestamp() * 1000)
print(ms)  # 1735660800000

# 解析带毫秒的日期字符串
dt_str = '2025-01-01 00:00:00.123'
dt = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S.%f')
ms = int(dt.timestamp() * 1000)

Java 毫秒时间戳

Java
// 获取当前毫秒时间戳
long ms = System.currentTimeMillis();
System.out.println(ms);  // 1735660800000

// 使用Instant
import java.time.Instant;
long ms2 = Instant.now().toEpochMilli();

// 毫秒时间戳转日期时间
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

long ms = 1735660800000L;
LocalDateTime dateTime = LocalDateTime.ofInstant(
    Instant.ofEpochMilli(ms), 
    ZoneId.systemDefault()
);
System.out.println(dateTime);  // 2025-01-01T00:00:00

// 日期时间转毫秒时间戳
LocalDateTime dt = LocalDateTime.of(2025, 1, 1, 0, 0, 0);
long ms3 = dt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

MySQL 毫秒时间戳

SQL
-- 获取当前毫秒时间戳
SELECT ROUND(UNIX_TIMESTAMP(NOW(3)) * 1000) as ms_timestamp;
-- 结果: 1735660800000

-- 存储毫秒时间戳的表设计
CREATE TABLE events (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_name VARCHAR(100),
    created_at BIGINT UNSIGNED,  -- 存储毫秒时间戳
    INDEX idx_created (created_at)
);

-- 插入数据(毫秒时间戳)
INSERT INTO events (event_name, created_at)
VALUES ('click', ROUND(UNIX_TIMESTAMP(NOW(3)) * 1000));

-- 毫秒时间戳转日期
SELECT FROM_UNIXTIME(created_at / 1000) as datetime
FROM events;

-- 带毫秒精度显示
SELECT FROM_UNIXTIME(created_at / 1000, '%Y-%m-%d %H:%i:%s.%f') as datetime_ms
FROM events;

-- 查询最近1小时的数据
SELECT * FROM events
WHERE created_at >= (UNIX_TIMESTAMP(NOW(3)) - 3600) * 1000;

时间戳精度转换

text
秒级与毫秒级时间戳互转:

【秒 → 毫秒】
乘以 1000
1735660800 → 1735660800000

【毫秒 → 秒】
除以 1000(取整)
1735660800000 → 1735660800

【JavaScript】
秒 → 毫秒: timestampSec * 1000
毫秒 → 秒: Math.floor(timestampMs / 1000)

【Python】
秒 → 毫秒: int(timestampSec * 1000)
毫秒 → 秒: timestampMs // 1000

【Java】
秒 → 毫秒: timestampSec * 1000L
毫秒 → 秒: timestampMs / 1000

【注意事项】
- 转换时注意整数溢出问题
- 毫秒转秒时使用整除,避免浮点数
- 不同语言默认精度不同,注意区分

最佳实践

  • JavaScript的Date对象默认使用毫秒,注意与其他语言对接时的转换
  • 数据库存储毫秒时间戳时使用BIGINT类型,避免精度丢失
  • API传输时明确时间戳精度,避免秒/毫秒混淆
  • 性能敏感场景考虑使用纳秒时间戳(如Go的UnixNano())