Karate框架中日期相减返回NaN问题的技术求助
问题原因
你得到NaN的核心原因是:today和releaseDate都是字符串类型的日期,字符串之间做减法运算无法得到有效数字。
JavaScript中,当你对两个字符串执行减法操作时,会尝试将它们转换为数字。但像Dec 08, 2022这类日期字符串无法被解析为合法数字,运算结果自然就是NaN(非数字)。
正确的日期差计算方法
要解决这个问题,需要先把日期字符串转换为时间戳(毫秒数)或Date对象,再进行差值计算。以下是几种在Karate中可行的实现方式:
方式一:使用Java日期工具类(推荐,格式控制更精准)
利用Java的SimpleDateFormat解析日期字符串为Date对象,再转换为时间戳计算天数差:
Scenario: Testing date Given url When method get Then status 200 # 先获取字符串格式的发布日期 And def releaseDateStr = response.meta.event.releaseDate And print "Release Date is: ", releaseDateStr # 初始化日期格式化器,匹配目标日期格式 * def Sdf = Java.type('java.text.SimpleDateFormat') * def dateFormatter = new Sdf('MMM dd, yyyy') # 将字符串日期解析为Java Date对象,再转为毫秒级时间戳 * def releaseDateTimestamp = dateFormatter.parse(releaseDateStr).getTime() # 获取当前时间的毫秒级时间戳 * def todayTimestamp = new java.util.Date().getTime() # 计算天数差:总毫秒数 / 每天的毫秒数(1000*60*60*24) * def diffDays = Math.round((todayTimestamp - releaseDateTimestamp) / (1000 * 60 * 60 * 24)) And print "Difference is: ", diffDays And assert diffDays >= 14
方式二:使用JavaScript Date对象
直接用JS的Date构造函数解析日期字符串(Karate基于Nashorn引擎,支持这种格式的解析):
Scenario: Testing date Given url When method get Then status 200 And def releaseDateStr = response.meta.event.releaseDate And print "Release Date is: ", releaseDateStr # 将日期字符串转为JS Date对象,再取毫秒时间戳 * def releaseDateTimestamp = new Date(releaseDateStr).getTime() # 获取当前时间戳 * def todayTimestamp = new Date().getTime() # 计算天数差 * def diffDays = Math.round((todayTimestamp - releaseDateTimestamp) / (1000 * 60 * 60 * 24)) And print "Difference is: ", diffDays And assert diffDays >= 14
方式三:修复自定义datediff函数
调整自定义函数,在内部完成字符串到时间戳的转换:
Scenario: Testing date Given url When method get Then status 200 And def releaseDateStr = response.meta.event.releaseDate And print "Release Date is: ", releaseDateStr # 定义支持字符串输入的日期差计算函数 * def datediff = """ function(startDateStr, endDateStr) { const startTs = new Date(startDateStr).getTime(); const endTs = new Date(endDateStr).getTime(); // 计算天数差并四舍五入 return Math.round((endTs - startTs) / (1000 * 60 * 60 * 24)); } """ # 生成符合格式的当前日期字符串 * def todayStr = new Date().toLocaleDateString('en-US', { month: 'short', day: '2-digit', year: 'numeric' }) And print "Today's date is: ", todayStr # 调用函数计算差值 * def diffDays = datediff(releaseDateStr, todayStr) And print "Difference is: ", diffDays And assert diffDays >= 14
注意事项
- 确保日期格式化规则和接口返回的日期字符串完全匹配,比如如果接口返回的是
August 15, 2002(月份全称),需要把格式字符串改为MMMM dd, yyyy。 - Java的
SimpleDateFormat非线程安全,但Karate测试通常是单线程执行,无需担心并发问题。
内容的提问来源于stack exchange,提问作者Vivek Arora
相关产品推荐
相关产品推荐

