如何使用Groovy从java.sql.Timestamp提取秒与纳秒部分?
针对时间戳处理的两个问题解答
问题1:如何从时间戳中仅提取秒数?
这里有两种常用的方式,看你更倾向哪种:
- 直接调用
Timestamp的getSeconds()方法(虽然Java 8+标记为过时,但Groovy环境下依然可用,适合快速实现):def time = new Timestamp(System.currentTimeMillis()) int seconds = time.getSeconds() println(seconds) // 输出0-59之间的秒数 - 推荐使用Java 8+的现代时间API(更规范,无过时风险):
def time = new Timestamp(System.currentTimeMillis()) int seconds = time.toLocalDateTime().getSecond() println(seconds)
问题2:提取秒和纳秒部分(如19.444)
你的需求是拿到「秒.毫秒」格式的结果,刚好Timestamp提供了获取纳秒的方法,我们可以把纳秒转成毫秒级的小数部分,和秒数组合:
方法1:得到字符串格式的结果(如"19.444")
def time = new Timestamp(System.currentTimeMillis()) // 获取秒数 int seconds = time.toLocalDateTime().getSecond() // 获取纳秒并转成三位毫秒(1纳秒=1e-6毫秒,所以除以1000000) long millisPart = time.getNanos() / 1000000 // 格式化确保是三位数字(比如纳秒是444000000的话,转成444) String result = "${seconds}.${String.format("%03d", millisPart)}" println(result)
方法2:得到数值类型的结果(如19.444)
如果需要用数值进行计算,可以直接转换成Double:
def time = new Timestamp(System.currentTimeMillis()) // 秒数 + 纳秒转成的秒数(1纳秒=1e-9秒) double secondsWithFraction = time.toLocalDateTime().getSecond() + (time.getNanos() / 1e9) // 保留三位小数,避免精度问题 BigDecimal formatted = BigDecimal.valueOf(secondsWithFraction).setScale(3, RoundingMode.HALF_UP) println(formatted.doubleValue())
方法3:从时间戳字符串中提取(如果已经有字符串形式)
要是你已经把Timestamp转成了字符串,也可以用正则直接匹配:
def timeStr = time.toString() // 比如"2018-01-24 13:56:19.444" def pattern = ~/:(\d+\.\d{3})$/ def matcher = timeStr =~ pattern if (matcher.find()) { println(matcher.group(1)) // 输出"19.444" }
内容的提问来源于stack exchange,提问作者Code123
相关产品推荐
相关产品推荐

