各编程语言获取当前时间戳的方法
Unix 时间戳是从 1970 年 1 月 1 日 UTC 起经过的秒数,不受时区影响。不同语言获取时间戳的 API 各不相同,有的默认返回秒(10 位),有的默认返回毫秒(13 位)。本文汇总七种常用语言的写法,秒级和毫秒级都给出,代码可直接运行。如果只想快速查看当前时间戳数值,也可以直接使用时间戳转换工具。
JavaScript
JavaScript 的 Date 对象以毫秒为基准,获取秒级时间戳需要除以 1000 再取整。
// 毫秒时间戳(13 位)
const ms = Date.now();
// 秒级时间戳(10 位)
const sec = Math.floor(Date.now() / 1000);
console.log(ms, sec);
Python
time.time() 返回带小数的秒浮点数,取整得到秒级,乘 1000 得到毫秒级。
import time
# 秒级时间戳(10 位)
sec = int(time.time())
# 毫秒时间戳(13 位)
ms = int(time.time() * 1000)
print(sec, ms)
Java
System.currentTimeMillis() 是最常用的毫秒时间戳方法;Java 8 之后也可以用 Instant。
// 毫秒时间戳(13 位)
long ms = System.currentTimeMillis();
// 秒级时间戳(10 位)
long sec = ms / 1000;
// 或者:long sec = Instant.now().getEpochSecond();
System.out.println(sec + " " + ms);
Go
标准库 time 包提供了秒和毫秒的现成方法。
package main
import (
"fmt"
"time"
)
func main() {
sec := time.Now().Unix() // 秒级(10 位)
ms := time.Now().UnixMilli() // 毫秒级(13 位,Go 1.17+)
fmt.Println(sec, ms)
}
PHP
time() 直接返回秒级时间戳;毫秒需要用 microtime(true) 计算。
<?php
// 秒级时间戳(10 位)
$sec = time();
// 毫秒时间戳(13 位)
$ms = (int)(microtime(true) * 1000);
echo $sec . " " . $ms;
?>
C#
.NET 的 DateTimeOffset 提供了秒和毫秒两个属性,注意要用 UtcNow 而不是 Now。
// 秒级时间戳(10 位)
long sec = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
// 毫秒时间戳(13 位)
long ms = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
Console.WriteLine($"{sec} {ms}");
Shell(Linux / macOS)
date 命令的 +%s 格式输出秒级时间戳;毫秒可用 +%s%3N(macOS 自带 date 不支持 %N,可用 Python 兜底)。
# 秒级时间戳(10 位)
date +%s
# 毫秒时间戳(13 位,Linux)
date +%s%3N
# 毫秒时间戳(macOS 兼容写法)
python3 -c 'import time; print(int(time.time()*1000))'
为什么代码里更推荐存时间戳
相比「2026-07-22 22:20:00」这样的日期字符串,时间戳是一个纯整数,有三个明显优势:
- 比较与排序快:判断早晚、按时间排序都是一次整数比较,无需解析格式。
- 没有歧义:字符串依赖时区和格式约定,跨系统传输容易出错;时间戳在全球任何机器上都表示同一时刻。
- 计算方便:加减天数、算间隔就是整数加减,例如「一天后」就是当前时间戳加 86400。
需要注意的是,如果你的系统还在用 32 位整数存时间戳,它将在 2038 年溢出,这个问题详见《2038 年问题:Unix 时间戳的千年虫》一文,新系统应统一使用 64 位整数。
注意事项
- 秒与毫秒别混淆:调用方接口约定不一致是联调中最常见的时间戳 bug,10 位和 13 位一定要先对齐。
- 时间戳没有时区:时间戳是绝对时刻,显示成日期时才需要时区,不要为了「北京时区」去手动加 8 小时。
- 服务器时钟要同步:时间戳来自本机系统时钟,生产环境建议配置 NTP 校时,避免时间漂移。
拿到时间戳后想验证它对应的具体日期时间,可以用时间戳转换工具一键换算。