Groovy:从字符串计算的Timeduration-Subtraction

时间:2013-04-10 14:30:35

标签: string date groovy subtraction evaluate

我的脚本从文件中读取一个字符串,并将其评估为在TimeCategory中作为TimeDuration工作。如果字符串以“ - ”开头,则抛出异常。

我的简化剧本:

import groovy.time.TimeCategory;

String string = "-1.day"
Date now = new Date()
use(TimeCategory)
{
    def x = new Date() + evaluate(string)
    println x
}

抛出:

groovy.lang.MissingMethodException: No signature of method: groovy.time.Duration.negative() is applicable for argument types: () values: []
    Possible solutions: notify()

目前我的解决方案是:

import groovy.time.TimeCategory;

String string = "-1.day"
Date now = new Date()
use(TimeCategory)
{
    def x
    if(string.startsWith("-"))
    {
        string = string.substring(1)
        x = now - evaluate(string)
    }
    else
    {
        x = now + evaluate(string)
    }
    println x
}

虽然可以做到以下几点。但是......我不喜欢它。我不确定后果(它会用于不同的时间单位吗?“-1.day + 2.hours-3.minutes”):

String prestring = "-1.day"
String string = "0.day$prestring"

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

问题是评估操作的顺序:

-1.day相当于-(1.day)(1.day).negative()

要解决此问题,您可以先应用括号来评估减号运算符:

(-1).day

另一种解决方案是向negative()类添加Duration方法。

Duration.metaClass.negative = { -> 
    new Duration(-delegate.days, 
                 -delegate.hours, 
                 -delegate.minutes, 
                 -delegate.seconds, 
                 -delegate.millis) 
}