Do not represent time values with precision > 11. Closes #1944.
This commit is contained in:
parent
fea1efba41
commit
6bc9a6ea8e
@ -60,10 +60,7 @@ public class WbDateConstant implements WbExpression<TimeValue> {
|
|||||||
.put(new SimpleDateFormat("yyyy"), 9)
|
.put(new SimpleDateFormat("yyyy"), 9)
|
||||||
.put(new SimpleDateFormat("yyyy-MM"), 10)
|
.put(new SimpleDateFormat("yyyy-MM"), 10)
|
||||||
.put(new SimpleDateFormat("yyyy-MM-dd"), 11)
|
.put(new SimpleDateFormat("yyyy-MM-dd"), 11)
|
||||||
.put(new SimpleDateFormat("yyyy-MM-dd'T'HH"), 12)
|
.build();
|
||||||
.put(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"), 13)
|
|
||||||
.put(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"), 13)
|
|
||||||
.put(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"), 14).build();
|
|
||||||
|
|
||||||
private TimeValue parsed;
|
private TimeValue parsed;
|
||||||
private String origDatestamp;
|
private String origDatestamp;
|
||||||
@ -100,25 +97,27 @@ public class WbDateConstant implements WbExpression<TimeValue> {
|
|||||||
*/
|
*/
|
||||||
public static TimeValue parse(String datestamp)
|
public static TimeValue parse(String datestamp)
|
||||||
throws ParseException {
|
throws ParseException {
|
||||||
Date date = null;
|
Date bestDate = null;
|
||||||
int precision = 9; // default precision (will be overridden)
|
int precision = 0; // default precision (will be overridden if successfully parsed)
|
||||||
|
int maxLength = 0; // the maximum length parsed
|
||||||
for (Entry<SimpleDateFormat, Integer> entry : acceptedFormats.entrySet()) {
|
for (Entry<SimpleDateFormat, Integer> entry : acceptedFormats.entrySet()) {
|
||||||
ParsePosition position = new ParsePosition(0);
|
ParsePosition position = new ParsePosition(0);
|
||||||
String trimmedDatestamp = datestamp.trim();
|
String trimmedDatestamp = datestamp.trim();
|
||||||
date = entry.getKey().parse(trimmedDatestamp, position);
|
Date date = entry.getKey().parse(trimmedDatestamp, position);
|
||||||
|
|
||||||
// Ignore parses which failed or do not consume all the input
|
// Ignore parses which failed or do not consume all the input
|
||||||
if (date != null && position.getIndex() == trimmedDatestamp.length()) {
|
if (date != null && position.getIndex() > maxLength) {
|
||||||
precision = entry.getValue();
|
precision = entry.getValue();
|
||||||
break;
|
bestDate = date;
|
||||||
|
maxLength = position.getIndex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (date == null) {
|
if (bestDate == null || precision == 0) {
|
||||||
throw new ParseException("Invalid date.", 0);
|
throw new ParseException("Invalid date.", 0);
|
||||||
} else {
|
} else {
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
calendar = Calendar.getInstance();
|
calendar = Calendar.getInstance();
|
||||||
calendar.setTime(date);
|
calendar.setTime(bestDate);
|
||||||
return Datamodel.makeTimeValue(calendar.get(Calendar.YEAR), (byte) (calendar.get(Calendar.MONTH) + 1),
|
return Datamodel.makeTimeValue(calendar.get(Calendar.YEAR), (byte) (calendar.get(Calendar.MONTH) + 1),
|
||||||
(byte) calendar.get(Calendar.DAY_OF_MONTH), (byte) calendar.get(Calendar.HOUR_OF_DAY),
|
(byte) calendar.get(Calendar.DAY_OF_MONTH), (byte) calendar.get(Calendar.HOUR_OF_DAY),
|
||||||
(byte) calendar.get(Calendar.MINUTE), (byte) calendar.get(Calendar.SECOND), (byte) precision, 0, 0,
|
(byte) calendar.get(Calendar.MINUTE), (byte) calendar.get(Calendar.SECOND), (byte) precision, 0, 0,
|
||||||
|
@ -37,7 +37,7 @@ public class WbDateConstantTest extends WbExpressionTest<TimeValue> {
|
|||||||
private WbDateConstant month = new WbDateConstant("2018-02");
|
private WbDateConstant month = new WbDateConstant("2018-02");
|
||||||
private WbDateConstant day = new WbDateConstant("2018-02-27");
|
private WbDateConstant day = new WbDateConstant("2018-02-27");
|
||||||
private WbDateConstant whitespace = new WbDateConstant(" 2018-02-27 ");
|
private WbDateConstant whitespace = new WbDateConstant(" 2018-02-27 ");
|
||||||
private WbDateConstant hour = new WbDateConstant("2018-02-27T13");
|
private WbDateConstant second = new WbDateConstant("2017-01-03T04:12:45");
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
@ -62,8 +62,8 @@ public class WbDateConstantTest extends WbExpressionTest<TimeValue> {
|
|||||||
TimeValue.CM_GREGORIAN_PRO), month);
|
TimeValue.CM_GREGORIAN_PRO), month);
|
||||||
evaluatesTo(Datamodel.makeTimeValue(2018, (byte) 2, (byte) 27, (byte) 0, (byte) 0, (byte) 0, (byte) 11, 0, 0, 0,
|
evaluatesTo(Datamodel.makeTimeValue(2018, (byte) 2, (byte) 27, (byte) 0, (byte) 0, (byte) 0, (byte) 11, 0, 0, 0,
|
||||||
TimeValue.CM_GREGORIAN_PRO), day);
|
TimeValue.CM_GREGORIAN_PRO), day);
|
||||||
evaluatesTo(Datamodel.makeTimeValue(2018, (byte) 2, (byte) 27, (byte) 13, (byte) 0, (byte) 0, (byte) 12, 0, 0,
|
evaluatesTo(Datamodel.makeTimeValue(2017, (byte) 1, (byte) 3, (byte) 0, (byte) 0, (byte) 0, (byte) 11, 0, 0, 0,
|
||||||
0, TimeValue.CM_GREGORIAN_PRO), hour);
|
TimeValue.CM_GREGORIAN_PRO), second);
|
||||||
|
|
||||||
evaluatesTo(Datamodel.makeTimeValue(2018, (byte) 2, (byte) 27, (byte) 0, (byte) 0, (byte) 0, (byte) 11, 0, 0, 0,
|
evaluatesTo(Datamodel.makeTimeValue(2018, (byte) 2, (byte) 27, (byte) 0, (byte) 0, (byte) 0, (byte) 11, 0, 0, 0,
|
||||||
TimeValue.CM_GREGORIAN_PRO), whitespace);
|
TimeValue.CM_GREGORIAN_PRO), whitespace);
|
||||||
@ -74,8 +74,9 @@ public class WbDateConstantTest extends WbExpressionTest<TimeValue> {
|
|||||||
new WbDateConstant("invalid format");
|
new WbDateConstant("invalid format");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
@Test
|
||||||
public void testPartlyValid() {
|
public void testPartlyValid() {
|
||||||
new WbDateConstant("2018-partly valid");
|
evaluatesTo(Datamodel.makeTimeValue(2018, (byte) 1, (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 9, 0, 0, 0,
|
||||||
|
TimeValue.CM_GREGORIAN_PRO), new WbDateConstant("2018-partly valid"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user