Groovy使用Math.ceil生成随机日期出现.0后缀格式问题如何解决
问题原因
你遇到的带小数点后缀问题,核心是Math.ceil()、Math.floor()方法返回的是Double类型,直接拼接字符串时就会自动带上.0后缀,和补零逻辑结合后就出现了02.0这类异常格式。
修正方案
方案1:原有代码最小改动
只需要在生成随机数值后强制转为整数类型即可,修改后代码如下:
def dob; //设置年份范围 def min = 1900; def max = 2004; // 转成Integer去掉小数位 def month = Math.ceil(Math.random() * 12) as Integer; def day = Math.ceil(Math.random() * 28) as Integer; def year = Math.floor(Math.random() * (max - min) + min) as Integer; //补零逻辑保持不变 if(month < 10) { month = "0" + month; } if(day < 10) { day = "0" + day; } //拼接日期 dob = month + "/" + day + "/" + year; return dob;
方案2:Groovy原生日期API实现(更严谨)
原有代码固定取28天会浪费大量合法日期,用Groovy自带的日期处理逻辑可以自动适配大小月、闰月的天数规则,实现更合理的随机日期生成:
import java.time.LocalDate import java.time.format.DateTimeFormatter def minYear = 1900 def maxYear = 2004 // 随机生成合法的年、月、日 def randomYear = new Random().nextInt(maxYear - minYear + 1) + minYear def randomMonth = new Random().nextInt(12) + 1 def maxDay = LocalDate.of(randomYear, randomMonth, 1).lengthOfMonth() def randomDay = new Random().nextInt(maxDay) + 1 // 直接格式化输出mm/dd/yyyy格式 def formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy") return LocalDate.of(randomYear, randomMonth, randomDay).format(formatter)
内容的提问来源于stack exchange,提问作者Raghav
相关产品推荐
相关产品推荐

