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 @ 44338

History | View | Annotate | Download (2.7 KB)

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

    
3
import java.time.Duration;
4
import java.time.LocalDate;
5
import java.time.LocalDateTime;
6
import java.time.Period;
7
import java.time.ZoneId;
8
import java.time.temporal.ChronoUnit;
9
import java.time.temporal.Temporal;
10
import java.time.temporal.TemporalUnit;
11
import java.util.Date;
12
import org.apache.commons.lang3.Range;
13
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DATEADD;
14
import org.gvsig.expressionevaluator.Interpreter;
15
import org.gvsig.expressionevaluator.spi.AbstractFunction;
16

    
17
public class DateAddFunction extends AbstractFunction {
18

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

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

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

    
84
}