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,)},)}

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

相关推荐
island13145 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
坚持就完事了5 小时前
Java中的集合
java·开发语言
摘星编程5 小时前
深入理解CANN ops-nn BatchNormalization算子:训练加速的关键技术
python
魔芋红茶5 小时前
Python 项目版本控制
开发语言·python
lili-felicity5 小时前
CANN批处理优化技巧:从动态批处理到流水线并行
人工智能·python
一个有梦有戏的人5 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
云小逸5 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
冰暮流星5 小时前
javascript之二重循环练习
开发语言·javascript·数据库
风指引着方向6 小时前
自定义算子开发入门:基于 CANN op-plugin 的扩展实践
开发语言
Fairy要carry6 小时前
面试-GRPO强化学习
开发语言·人工智能