{{$timestamp}} 默认生成10位秒级Unix时间戳,兼容性好、零配置;需毫秒或ISO格式时用{{$timestamp "ms"}}或{{$timestamp "YYYY-MM-DDTHH:mm:ss.sssZ"}};参与签名等复杂逻辑时才需Pre-request Script。

直接用 {{$timestamp}} 就行,90% 的场景不需要写脚本。 它默认生成秒级 Unix 时间戳(10 位),兼容性好、零配置、不报错。只有当你需要毫秒级、ISO 格式、或时间戳参与签名计算时,才得切到 Pre-request Script。
为什么 {{$timestamp}} 够用但常被忽略
很多人一上来就翻文档找 JS 写法,其实 Postman 早把最常用的时间戳封装成动态变量了。它不是 placeholder,是运行时实时求值的表达式,每次点击 Send 都刷新。
- 支持所有位置:URL 查询参数、Header 值、raw JSON body、form-data 字段值
- 不依赖环境变量,不用提前声明,也不占变量命名空间
- 默认输出是
1730741520这样的整数(秒级),后端验签最常认这个格式 - 如果后端要毫秒级,改用
{{$timestamp "ms"}};要 ISO 格式,用{{$timestamp "YYYY-MM-DDTHH:mm:ss.sssZ"}}
Pre-request Script 什么时候必须上
当时间戳要参与加密、拼接、或需严格对齐服务端时间时,{{$timestamp}} 就不够用了。比如签名规则是 MD5(id + key + timestamp),你得先拿到 timestamp,再算 MD5,最后把结果塞进 Header —— 这三步必须串在脚本里做。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- 用
Date.now()拿毫秒级时间戳,比new Date().getTime()更简洁 - 存变量优先用
pm.environment.set("timestamp", timestamp),别用postman.setEnvironmentVariable(已弃用) - 如果签名还依赖上一个响应里的字段,必须用
pm.variables.get()读取,不能靠{{$variable}}—— 后者只在请求发送前解析一次,不支持跨请求链路 - 调试时加
console.log(timestamp),输出会显示在 Postman Console(View → Show Postman Console)
Header 里设时间戳的两个典型错误
很多人把时间戳塞进 Header 后,接口一直 401 或 400,问题往往不在算法,而在 Header 键名或值格式没对齐。
- 键名大小写敏感:
Timestamp和timestamp是两个 Header,看文档确认大小写 - 值类型必须是字符串:
pm.request.headers.add({key: "Timestamp", value: timestamp})中的timestamp如果是数字,Postman 会自动转字符串;但如果你用JSON.stringify()包了一层,就会变成"1730741520"(带引号),后端解析失败 - 不要手动拼 Authorization:
Bearer {{$timestamp}}在 Header 值里写这种混合语法会失效 ——{{$xxx}}只在请求体/URL 中生效,Header 值里不解析动态变量 - 如果 Header 需要多个时间相关字段(如
X-Request-Time和X-Expires-In),必须在同一个脚本里一次性算完、设完,避免两次Date.now()产生毫秒级偏差
真正容易被忽略的是时间精度对齐:本地机器时间和服务器时间可能差几百毫秒,而有些接口校验窗口只有 30 秒。这时候光靠 Date.now() 不够,得用 pm.sendRequest 先调一次时间接口拉服务器时间,再基于它算偏移 —— 但这已经超出“传时间戳”的范畴了,属于联调阶段的深度适配。

















