一、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)}
六、注意事项
-
线程安全:内置函数是线程安全的,自定义脚本需要注意
-
性能:JSR223 脚本建议使用 Groovy,性能更好
-
格式一致性:确保前后端时间格式一致
-
时区问题:分布式测试时注意服务器时区
-
缓存:时间函数每次调用都会重新计算
七、调试技巧
-
使用 Debug Sampler 查看时间变量值
-
在 View Results Tree 中检查替换结果
-
使用
${__log()}函数记录时间值
java
${__log(${__time(yyyy-MM-dd HH:mm:ss,)},)}
这些时间函数可以灵活组合使用,满足大多数性能测试场景中对时间的需求。
