You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:08:38