Fixed: issue 1998
This commit is contained in:
parent
68b0bbcd92
commit
ae2f44f9d5
@ -34,6 +34,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
package com.google.refine.expr.functions.strings;
|
package com.google.refine.expr.functions.strings;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@ -57,43 +58,38 @@ public class Diff implements Function {
|
|||||||
String unit = ((String) o3).toLowerCase();
|
String unit = ((String) o3).toLowerCase();
|
||||||
OffsetDateTime c1 = (OffsetDateTime)o1;
|
OffsetDateTime c1 = (OffsetDateTime)o1;
|
||||||
OffsetDateTime c2 = (OffsetDateTime)o2;
|
OffsetDateTime c2 = (OffsetDateTime)o2;
|
||||||
|
try {
|
||||||
long delta = getNano(c1) - getNano(c2);
|
|
||||||
if ("nanos".equals(unit)) {
|
if ("nanos".equals(unit)) {
|
||||||
return delta;
|
return ChronoUnit.NANOS.between(c2, c1);
|
||||||
}
|
}
|
||||||
|
|
||||||
delta /= 1000;
|
|
||||||
if ("milliseconds".equals(unit)) {
|
if ("milliseconds".equals(unit)) {
|
||||||
return delta;
|
return ChronoUnit.MILLIS.between(c2, c1);
|
||||||
}
|
}
|
||||||
|
|
||||||
delta /= 1000000;
|
|
||||||
if ("seconds".equals(unit)) {
|
if ("seconds".equals(unit)) {
|
||||||
return delta;
|
return ChronoUnit.SECONDS.between(c2, c1);
|
||||||
}
|
}
|
||||||
delta /= 60;
|
|
||||||
if ("minutes".equals(unit)) {
|
if ("minutes".equals(unit)) {
|
||||||
return delta;
|
return ChronoUnit.MINUTES.between(c2, c1);
|
||||||
}
|
}
|
||||||
delta /= 60;
|
|
||||||
if ("hours".equals(unit)) {
|
if ("hours".equals(unit)) {
|
||||||
return delta;
|
return ChronoUnit.HOURS.between(c2, c1);
|
||||||
}
|
}
|
||||||
long days = delta / 24;
|
|
||||||
if ("days".equals(unit)) {
|
if ("days".equals(unit)) {
|
||||||
return days;
|
return ChronoUnit.DAYS.between(c2, c1);
|
||||||
}
|
}
|
||||||
if ("weeks".equals(unit)) {
|
if ("weeks".equals(unit)) {
|
||||||
return days / 7;
|
return ChronoUnit.WEEKS.between(c2, c1);
|
||||||
}
|
}
|
||||||
if ("months".equals(unit)) {
|
if ("months".equals(unit)) {
|
||||||
return days / 30;
|
return ChronoUnit.MONTHS.between(c2, c1);
|
||||||
}
|
}
|
||||||
if ("years".equals(unit)) {
|
if ("years".equals(unit)) {
|
||||||
return days / 365;
|
return ChronoUnit.YEARS.between(c2, c1);
|
||||||
}
|
}
|
||||||
return new EvalError("Unknown time unit " + unit);
|
return new EvalError("Unknown time unit " + unit);
|
||||||
|
} catch (ArithmeticException arithmeticException) {
|
||||||
|
return new EvalError("Number of " + unit + " between given dates causes long overflow.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -115,8 +111,4 @@ public class Diff implements Function {
|
|||||||
public String getReturns() {
|
public String getReturns() {
|
||||||
return "string for strings, number for dates";
|
return "string for strings, number for dates";
|
||||||
}
|
}
|
||||||
|
|
||||||
private long getNano(OffsetDateTime odt) {
|
|
||||||
return odt.toEpochSecond() * 1000000000l + odt.toInstant().getNano();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user