指南 / 代码

在代码中获取当前 Unix 时间戳

获取 Unix 秒或毫秒的 JavaScript、Python、Java、PHP、Go、SQL 与 Shell 示例。

JavaScript

const milliseconds = Date.now()
const seconds = Math.floor(milliseconds / 1000)

Python

import time
seconds = int(time.time())
milliseconds = time.time_ns() // 1_000_000

Java

long milliseconds = System.currentTimeMillis();
long seconds = java.time.Instant.now().getEpochSecond();

PHP、Go、SQL 与 Shell

PHP:   time()
Go:    time.Now().Unix()
PostgreSQL: floor(extract(epoch from now()))
Shell: date +%s

使用前核对单位

必须确认接收系统要求秒还是毫秒。单位不匹配比设备时钟错误更常见,也可能造成一千倍偏差。若代码运行在分布式系统中,还应确认主机时钟同步、整数类型范围以及序列化格式。

先核对函数返回单位

JavaScript 的 Date.now() 返回毫秒。Python 的 time.time() 返回带小数的秒,time.time_ns() 返回整数纳秒。Java 的 Instant 则拆分整秒与纳秒调整值。给毫秒数补零只改变表示单位,不等于增加真实测量精度。

建议用固定样本 1700000000 秒或 1700000000000 毫秒做单元测试,两者应在时间戳转换器得到 2023-11-14T22:13:20Z。比起不断变化的当前值,固定样本更容易发现千倍单位错误。

JavaScript 中区分日期与耗时

const milliseconds = Date.now()
const seconds = Math.floor(milliseconds / 1000)
const isoUtc = new Date(milliseconds).toISOString()

const started = performance.now()
// 在这里执行需要测量的操作。
const elapsedMilliseconds = performance.now() - started

前三行表达日历时刻,最后两行用单调时钟测量一段耗时,不是 Unix 时间戳。系统校时可能改变 Date.now(),所以短任务性能测量不应混用这两种时钟。

19 位数值怎么跨系统传递?

接收 19 位纳秒数据时,不要先转为 JavaScript Number。如果接收端不能精确保留大整数,在 JSON 中使用十进制字符串,再由支持的环境转成 BigInt。否则数据可能在进入转换器之前就已经丢了最后几位。

SQL 还应检查数据库引擎和会话时区,同名或近似函数可能返回不同类型,或使用不同的会话规则。把单位写进字段约定,导入后用已知样本复核;交换格式可参考ISO 8601 与 Unix 时间。

标准与运行时参考

工具 / 01—06

更多时间戳工具

每个工具都从明确的输入出发,给出明确的结果。