Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / main / java / org / gvsig / expressionevaluator / impl / function / date / DateAddFunction.java @ 44371

History | View | Annotate | Download (2.54 KB)

1
package org.gvsig.expressionevaluator.impl.function.date;
2

    
3
import java.time.LocalDateTime;
4
import java.time.ZoneId;
5
import java.time.temporal.ChronoUnit;
6
import java.util.Date;
7
import org.apache.commons.lang3.Range;
8
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DATEADD;
9
import org.gvsig.expressionevaluator.Interpreter;
10
import org.gvsig.expressionevaluator.spi.AbstractFunction;
11

    
12
public class DateAddFunction extends AbstractFunction {
13

    
14
    public DateAddFunction() {
15
        super("Date", FUNCTION_DATEADD,Range.is(3),
16
            "Adds a time/date interval to a date and then returns the date",
17
            FUNCTION_DATEADD+"({{interval}}, number, date)",
18
            new String[]{
19
                "interval - a string with the value year,month,day,hour,minute,second or millisecond.",
20
                "number - a number in the unit specified with interval parameter",
21
                "date - a Date",
22
            },
23
            "Date"
24
        );
25
    }
26

    
27
    @Override
28
    public boolean allowConstantFolding() {
29
        return true;
30
    }
31
    
32
    @Override
33
    public Object call(Interpreter interpreter, Object[] args) {
34
        String interval = this.getStr(args, 0);
35
        long number = this.getLong(args,1);
36
        LocalDateTime date = this.getLocalDateTime(args,2);
37

    
38
        switch(interval.toLowerCase()) {
39
            case "millisecond":
40
            case "ms":
41
                date = date.plus(number, ChronoUnit.MILLIS);
42
                break;
43
            case "second":
44
            case "ss":
45
            case "s":
46
                date = date.plus(number, ChronoUnit.SECONDS);
47
                break;
48
            case "minute":
49
            case "mi":
50
            case "n":
51
                date = date.plus(number, ChronoUnit.MINUTES);
52
                break;
53
            case "hour":
54
            case "hh":
55
                date = date.plus(number, ChronoUnit.HOURS);
56
                break;
57
            case "day":
58
            case "dy":
59
            case "y":
60
                date = date.plus(number, ChronoUnit.DAYS);
61
                break;
62
            case "month":
63
            case "mm":
64
            case "m":
65
                date = date.plus(number, ChronoUnit.MONTHS);
66
                break;
67
            case "year":
68
            case "yyyy":
69
            case "yy":
70
                date = date.plus(number, ChronoUnit.YEARS);
71
                break;
72
            default:
73
                throw new IllegalArgumentException("Unsupported interval '"+interval+"'.");
74
        } 
75
        return Date.from( date.atZone( ZoneId.systemDefault()).toInstant());
76
    }
77
    
78

    
79
}