2013-04-10 34 views
4

评估我的脚本从文件中读取一个字符串并将其评估为TimeCategory中的TimeDuration。如果字符串以“ - ”开头,则会引发异常。Groovy:Timeduration-Subtraction从字符串

我减少脚本:

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" 

有什么建议?

回答

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) 
} 
+0

谢谢。我将使用括号。我想用它“自然”,而不是编程。 – Simn 2013-04-11 06:23:33