mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 05:01:07 +00:00
CE-1955 Update getValueAsInstant to handle a single-digit hour, by assuming a leading 0 on it.
This commit is contained in:
@ -590,12 +590,36 @@ public class ValueUtils
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// first assume the instant is perfectly formatted, as in: 2007-12-03T10:15:30.00Z //
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
return Instant.parse(s);
|
return Instant.parse(s);
|
||||||
}
|
}
|
||||||
catch(DateTimeParseException e)
|
catch(DateTimeParseException e)
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// if the string isn't quite the right format, try some alternates that are common and fairly un-vague //
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
return tryAlternativeInstantParsing(s, e);
|
return tryAlternativeInstantParsing(s, e);
|
||||||
}
|
}
|
||||||
|
catch(DateTimeParseException dtpe)
|
||||||
|
{
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// we commonly receive date-times with only a single-digit hour after the space, which fails tryAlternativeInstantParsing. //
|
||||||
|
// so if we see what looks like that pattern, zero-pad the hour, and try the alternative parse patterns again. //
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
if(s.matches(".* \\d:.*"))
|
||||||
|
{
|
||||||
|
return tryAlternativeInstantParsing(s.replaceFirst(" (\\d):", " 0$1:"), e);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw (dtpe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -617,11 +641,12 @@ public class ValueUtils
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
private static Instant tryAlternativeInstantParsing(String s, DateTimeParseException e)
|
private static Instant tryAlternativeInstantParsing(String s, DateTimeParseException e) throws DateTimeParseException
|
||||||
{
|
{
|
||||||
//////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// 1999-12-31T12:59 //
|
// 1999-12-31T12:59 //
|
||||||
//////////////////////
|
// missing seconds & zone - but we're happy to assume :00 and UTC //
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
if(s.matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"))
|
if(s.matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$"))
|
||||||
{
|
{
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
@ -630,27 +655,30 @@ public class ValueUtils
|
|||||||
return Instant.parse(s + ":00Z");
|
return Instant.parse(s + ":00Z");
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
// 1999-12-31 12:59:59.0 //
|
// 1999-12-31 12:59:59.0 //
|
||||||
///////////////////////////
|
// fractional seconds and no zone - truncate, and assume UTC //
|
||||||
|
///////////////////////////////////////////////////////////////
|
||||||
else if(s.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.0$"))
|
else if(s.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.0$"))
|
||||||
{
|
{
|
||||||
s = s.replaceAll(" ", "T").replaceAll("\\..*$", "Z");
|
s = s.replaceAll(" ", "T").replaceAll("\\..*$", "Z");
|
||||||
return Instant.parse(s);
|
return Instant.parse(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////
|
////////////////////////////////////////////
|
||||||
// 1999-12-31 12:59:59 //
|
// 1999-12-31 12:59:59 //
|
||||||
/////////////////////////
|
// Missing 'T' and 'Z', so just add those //
|
||||||
|
////////////////////////////////////////////
|
||||||
else if(s.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"))
|
else if(s.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"))
|
||||||
{
|
{
|
||||||
s = s.replaceAll(" ", "T") + "Z";
|
s = s.replaceAll(" ", "T") + "Z";
|
||||||
return Instant.parse(s);
|
return Instant.parse(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////
|
/////////////////////////////////////////////
|
||||||
// 1999-12-31 12:59 //
|
// 1999-12-31 12:59 //
|
||||||
//////////////////////
|
// missing T, seconds, and Z - add 'em all //
|
||||||
|
/////////////////////////////////////////////
|
||||||
else if(s.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$"))
|
else if(s.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$"))
|
||||||
{
|
{
|
||||||
s = s.replaceAll(" ", "T") + ":00Z";
|
s = s.replaceAll(" ", "T") + ":00Z";
|
||||||
@ -661,12 +689,18 @@ public class ValueUtils
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
// such as '2011-12-03T10:15:30+01:00[Europe/Paris]'. //
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
return LocalDateTime.parse(s, DateTimeFormatter.ISO_ZONED_DATE_TIME).toInstant(ZoneOffset.UTC);
|
return LocalDateTime.parse(s, DateTimeFormatter.ISO_ZONED_DATE_TIME).toInstant(ZoneOffset.UTC);
|
||||||
}
|
}
|
||||||
catch(DateTimeParseException e2)
|
catch(DateTimeParseException e2)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
///////////////////////////////////////////////////////
|
||||||
|
// also includes such as '2011-12-03T10:15:30+01:00' //
|
||||||
|
///////////////////////////////////////////////////////
|
||||||
return LocalDateTime.parse(s, DateTimeFormatter.ISO_DATE_TIME).toInstant(ZoneOffset.UTC);
|
return LocalDateTime.parse(s, DateTimeFormatter.ISO_DATE_TIME).toInstant(ZoneOffset.UTC);
|
||||||
}
|
}
|
||||||
catch(Exception e3)
|
catch(Exception e3)
|
||||||
|
@ -251,6 +251,9 @@ class ValueUtilsTest extends BaseTest
|
|||||||
assertThrows(QValueException.class, () -> ValueUtils.getValueAsInstant("a,b"));
|
assertThrows(QValueException.class, () -> ValueUtils.getValueAsInstant("a,b"));
|
||||||
assertThrows(QValueException.class, () -> ValueUtils.getValueAsInstant("1980/05/31"));
|
assertThrows(QValueException.class, () -> ValueUtils.getValueAsInstant("1980/05/31"));
|
||||||
assertThat(assertThrows(QValueException.class, () -> ValueUtils.getValueAsInstant(new Object())).getMessage()).contains("Unsupported class");
|
assertThat(assertThrows(QValueException.class, () -> ValueUtils.getValueAsInstant(new Object())).getMessage()).contains("Unsupported class");
|
||||||
|
|
||||||
|
expected = Instant.parse("1980-05-31T01:30:00Z");
|
||||||
|
assertEquals(expected, ValueUtils.getValueAsInstant("1980-05-31 1:30:00"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user