Groovy中如何判断微秒级时间戳是否已超过1小时?
问题分析与解决方案
我看了你的代码和示例参数,问题主要出在时间单位不匹配和细节错误上,咱们一步步拆解解决:
核心问题点
1小时的时间戳数值错误:
你的submitTime和currentTime都是纳秒级时间戳(示例数值除以1e9就能得到带毫秒的标准秒数,符合时间戳特征),但你定义的oneHhour = 3600000000——这个其实是3600秒的微秒数(3.6e9),而纳秒级的1小时应该是3600 * 1000 * 1000 * 1000 = 3600000000000,差了整整1000倍!这就是为什么你算出的差值686698092179(约686秒,11分钟)看起来不符合预期的原因——你拿11分钟和1小时的微秒数去比,当然判断逻辑会出错。小细节问题:
- 变量名拼写错误:
oneHhour应该是oneHour(虽然不影响运行,但可读性差) if语句缺少闭合的},会直接导致编译报错submitTime未显式转换类型,可能因为类型不匹配引发计算异常
- 变量名拼写错误:
修正后的代码
// 获取当前时间的纳秒级时间戳,用System.currentTimeMillis()更简洁高效 long currentTime = System.currentTimeMillis() * 1000000L; // 显式转换submitTime为long类型,确保计算时类型一致 long submitTime = job.SubmitTime as long; // 定义1小时对应的纳秒数,用分步计算提升可读性 long oneHour = 3600 * 1000 * 1000 * 1000L; if (currentTime - submitTime > oneHour) { println "${job.Name} env is up more than 1 hour"; }
额外优化建议
为了避免后续再犯单位错误,可以用常量定义时间单位,让代码更清晰:
final long NANO_PER_SECOND = 1000000000L; final long ONE_HOUR_IN_NANOS = 3600 * NANO_PER_SECOND; long currentTime = System.currentTimeMillis() * 1000000L; long submitTime = job.SubmitTime as long; if (currentTime - submitTime > ONE_HOUR_IN_NANOS) { println "${job.Name} env is up more than 1 hour"; }
验证示例参数
用你的测试数值计算:
- currentTime = 1527530605357000000(纳秒)
- submitTime = 1527529918658907821(纳秒)
- 差值:
1527530605357000000 - 1527529918658907821 = 686698092179纳秒 = 686.698秒 ≈ 11分26秒,确实小于1小时(3600秒),不会触发打印,符合预期。
内容的提问来源于stack exchange,提问作者Loren
相关产品推荐
相关产品推荐

