JMeter 时间函数合集

一、JMeter 内置时间函数

1. __time 函数

最常用的时间函数,返回当前时间戳

java

复制代码
// 格式:${__time(格式, 变量名)}
${__time()}                    // 毫秒时间戳(默认)
${__time(/1000,)}              // 秒时间戳
${__time(yyyy-MM-dd,)}         // 日期:2024-01-15
${__time(HH:mm:ss,)}           // 时间:14:30:25
${__time(yyyyMMddHHmmss,)}     // 完整:20240115143025
${__time(yyyy-MM-dd HH:mm:ss,)} // 标准格式
${__time(,timestamp)}          // 保存到变量

2. __timeShift 函数(JMeter 5.3+)

时间偏移计算

java

复制代码
// 格式:${__timeShift(格式, 日期, 偏移量, 语言环境, 变量名)}
${__timeShift(yyyy-MM-dd, P1D)}           // 明天
${__timeShift(yyyy-MM-dd, P-1D)}          // 昨天
${__timeShift(yyyy-MM-dd, P1M)}           // 下个月
${__timeShift(yyyy-MM-dd HH:mm:ss,, P2DT1H30M)} // 2天1小时30分钟后
${__timeShift(yyyy-MM-dd,, -P1D,, dateVar)} // 昨天保存到变量

3. __RandomDate 函数

生成随机日期

java

复制代码
// 格式:${__RandomDate(格式, 开始日期, 结束日期, 变量名)}
${__RandomDate(yyyy-MM-dd, 2024-01-01, 2024-12-31)}
${__RandomDate(,,2024-12-31,randomDate)} // 默认格式,保存到变量

二、日期格式说明

常用格式符

java

复制代码
yyyy - 年份(2024)
MM   - 月份(01-12)
dd   - 日期(01-31)
HH   - 24小时制小时(00-23)
mm   - 分钟(00-59)
ss   - 秒(00-59)
SSS  - 毫秒(000-999)
E    - 星期几(Mon, Tue...)

时间段偏移格式

java

复制代码
P    - 时间段标识
D    - 天
M    - 月
Y    - 年
T    - 时间分隔符
H    - 小时
M    - 分钟
S    - 秒

示例:
P1D     - 1天
P-2DT3H - 减2天加3小时
PT1H30M - 1小时30分钟

三、通过 JSR223 生成时间

1. Groovy 脚本(推荐)

groovy

复制代码
// 当前时间戳
def timestamp = System.currentTimeMillis()

// 格式化日期
import java.text.SimpleDateFormat
def sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
def now = sdf.format(new Date())

// 日期计算
import java.time.*
def tomorrow = LocalDate.now().plusDays(1).toString()
def nextHour = LocalDateTime.now().plusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))

// 随机日期
def random = new Random()
def randomDay = LocalDate.now().plusDays(random.nextInt(30))

vars.put("currentTime", now)
vars.put("tomorrow", tomorrow)

2. Beanshell 脚本

java

复制代码
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

// 获取当前时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = sdf.format(new Date());

// 时间加减
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -1); // 昨天
String yesterday = sdf.format(cal.getTime());

vars.put("currentTime", currentTime);
vars.put("yesterday", yesterday);

四、实际应用示例

1. 请求参数中使用时间

java

复制代码
// HTTP请求参数
startTime=${__time(yyyy-MM-dd 00:00:00,)}
endTime=${__time(yyyy-MM-dd 23:59:59,)}
randomDate=${__RandomDate(yyyy-MM-dd,,2024-12-31,)}

// JSON请求体
{
  "timestamp": "${__time(/1000,)}",
  "date": "${__time(yyyy-MM-dd,)}",
  "expireDate": "${__timeShift(yyyy-MM-dd, P30D)}"
}

2. 文件名包含时间戳

java

复制代码
// 保存结果文件
C:/results/test_${__time(yyyyMMdd_HHmmss,)}.jtl

// 保存响应数据
response_${__time(yyyyMMddHHmmss,)}.json

3. 时间断言

java

复制代码
// 响应时间断言
${__timeShift(yyyy-MM-dd,, P1D,, tomorrow)}
// 检查响应是否包含明天日期

4. 动态时间范围查询

java

复制代码
// 查询最近7天数据
startDate=${__timeShift(yyyy-MM-dd, P-7D)}
endDate=${__time(yyyy-MM-dd)}

// 或者使用变量
${__timeShift(yyyy-MM-dd, P${dayOffset}D)}

五、高级技巧

1. 时区处理

groovy

复制代码
// Groovy脚本设置时区
def sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"))
def beijingTime = sdf.format(new Date())

2. 性能测试中的时间同步

java

复制代码
// 使用同步定时器确保时间准确
// 配合 __time 函数使用

3. 时间变量在循环中的使用

java

复制代码
// 每次循环使用不同时间
${__timeShift(yyyy-MM-dd, P${__iterationNum}D)}

六、注意事项

  1. 线程安全:内置函数是线程安全的,自定义脚本需要注意

  2. 性能:JSR223 脚本建议使用 Groovy,性能更好

  3. 格式一致性:确保前后端时间格式一致

  4. 时区问题:分布式测试时注意服务器时区

  5. 缓存:时间函数每次调用都会重新计算

七、调试技巧

  1. 使用 Debug Sampler 查看时间变量值

  2. View Results Tree 中检查替换结果

  3. 使用 ${__log()} 函数记录时间值

java

复制代码
${__log(${__time(yyyy-MM-dd HH:mm:ss,)},)}

这些时间函数可以灵活组合使用,满足大多数性能测试场景中对时间的需求。

相关推荐
xcs1940512 小时前
前端 项目构建问题 \node_modules\loader-runner\lib\loadLoader.js
开发语言·前端·javascript
一人の梅雨13 小时前
VVIC图片搜索接口进阶实战:服装批发场景下的精准识图与批量调度方案
开发语言·机器学习·php
s1hiyu13 小时前
实时控制系统验证
开发语言·c++·算法
大模型玩家七七13 小时前
向量数据库实战:从“看起来能用”到“真的能用”,中间隔着一堆坑
数据库·人工智能·python·深度学习·ai·oracle
AC赳赳老秦13 小时前
科研数据叙事:DeepSeek将实验数据转化为故事化分析框架
开发语言·人工智能·数据分析·r语言·时序数据库·big data·deepseek
2301_7634724613 小时前
使用PyQt5创建现代化的桌面应用程序
jvm·数据库·python
爱学习的阿磊13 小时前
Web开发与API
jvm·数据库·python
楼田莉子13 小时前
C++现代特性学习:C++14
开发语言·c++·学习·visual studio
qq_1927798713 小时前
Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
jvm·数据库·python
2301_7657031413 小时前
C++代码复杂度控制
开发语言·c++·算法