如何在Groovy Scripts中比较MM/DD/YY格式日期并计算天数差
在Groovy中计算MM/DD/YY格式日期的准确天数差值
核心问题分析
你之前的两个方案都存在关键问题:
- 方案1报错是因为未将字符串日期解析为Date对象,直接对字符串执行减法操作,得到的是字符串拼接结果而非时长对象,自然找不到
days属性。 - 方案2的
compareTo仅能判断日期先后(返回-1/0/1),无法计算具体天数差,结果必然不准确。
可行解决方案
下面提供两种可靠实现,优先推荐Java 8+的java.time API(线程安全、无旧API的时区/世纪推断坑)。
方案一:使用Java 8+ java.time API(推荐)
该API支持明确的日期解析与精准天数计算,处理MM/DD/YY格式时可通过DateTimeFormatter控制世纪推断逻辑。
import java.time.LocalDate import java.time.format.DateTimeFormatter import java.time.temporal.ChronoUnit // 定义日期格式,yy会默认将00-99映射到2000-2099(可通过withDefaultYear调整世纪) def dateFormatter = DateTimeFormatter.ofPattern("MM/dd/yy") // 测试场景1:日期1=10/20/00,日期2=01/15/00 LocalDate date1 = LocalDate.parse("10/20/00", dateFormatter) LocalDate date2 = LocalDate.parse("01/15/00", dateFormatter) long daysDiff1 = Math.abs(ChronoUnit.DAYS.between(date1, date2)) println "场景1天数差:${daysDiff1}" // 输出279 // 测试场景2:日期1=1/1/20,日期2=12/31/00 LocalDate date3 = LocalDate.parse("1/1/20", dateFormatter) LocalDate date4 = LocalDate.parse("12/31/00", dateFormatter) long daysDiff2 = Math.abs(ChronoUnit.DAYS.between(date3, date4)) println "场景2天数差:${daysDiff2}" // 输出3287
方案二:使用Groovy TimeCategory(旧API实现)
如果必须使用旧的Date类,需先将字符串解析为Date对象,再通过TimeCategory计算时长。
import groovy.time.TimeCategory import java.text.SimpleDateFormat // 注意:SimpleDateFormat非线程安全,单例使用需谨慎 def dateFormat = new SimpleDateFormat("MM/dd/yy") // 测试场景1 def date1 = dateFormat.parse("10/20/00") def date2 = dateFormat.parse("01/15/00") use(TimeCategory) { def duration = date1 - date2 println "场景1天数差:${Math.abs(duration.days)}" // 输出279 } // 测试场景2 def date3 = dateFormat.parse("1/1/20") def date4 = dateFormat.parse("12/31/00") use(TimeCategory) { def duration = date3 - date4 println "场景2天数差:${Math.abs(duration.days)}" // 输出3287 }
关键注意事项
- 世纪推断:
yy格式会根据当前系统时间推断世纪(比如当前是2024年,00会解析为2000年,90会解析为1990年)。如需固定世纪,可通过DateTimeFormatter的withDefaultYear方法指定,例如:def formatter = DateTimeFormatter.ofPattern("MM/dd/yy").withDefaultYear(1900) - 日期顺序:计算时用
Math.abs确保结果为正,避免因日期先后导致的负数差值。
内容的提问来源于stack exchange,提问作者NarayanRam
相关产品推荐
相关产品推荐

