From 3bf585ec80060bd3ee7a378bbbdfb4b1f2ffaddb Mon Sep 17 00:00:00 2001 From: nick Date: Sat, 9 Dec 2023 09:30:31 +0200 Subject: [PATCH] tbel fix_bug tbDate delete String... options --- .../thingsboard/script/api/tbel/TbDate.java | 34 ++++++++++++------- .../api/tbel/TbDateConstructorTest.java | 1 - 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java index 5deacdebbd..f428f08663 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java @@ -54,19 +54,19 @@ public class TbDate implements Serializable, Cloneable { } public TbDate(String s) { - this.instant = parseInstant(s, null, Locale.getDefault().toLanguageTag()); + this.instant = parseInstant(s); } public TbDate(String s, String pattern) { - this.instant = parseInstant(s, pattern, Locale.getDefault().toLanguageTag()); + this.instant = parseInstant(s, Locale.getDefault().toLanguageTag(), pattern); } public TbDate(String s, String pattern, String locale) { - this.instant = parseInstant(s, pattern, locale); + this.instant = parseInstant(s, locale, pattern); } public TbDate(String s, String pattern, String locale, String zoneId) { - this.instant = parseInstant(s, pattern, locale, zoneId); + this.instant = parseInstant(s, pattern, locale, zoneId); } public TbDate(long dateMilliSecond) { @@ -487,11 +487,10 @@ public class TbDate implements Serializable, Cloneable { } } - private static Instant parseInstant(String s, String pattern, String localeStr) { + private static Instant parseInstant(String s) { DateTimeFormatter formatter; - if (pattern != null) { - formatter = DateTimeFormatter.ofPattern(pattern, Locale.forLanguageTag(localeStr)); - } else if (s.length() > 0 && Character.isDigit(s.charAt(0))) { + boolean isIsoFormat = s.length() > 0 && Character.isDigit(s.charAt(0)); + if (isIsoFormat) { // assuming "2007-12-03T10:15:30.00Z" UTC instant // assuming "2007-12-03T10:15:30.00" ZoneId.systemDefault() instant // assuming "2007-12-03T10:15:30.00-04:00" TZ instant @@ -507,10 +506,7 @@ public class TbDate implements Serializable, Cloneable { return Instant.from(formatter.parse(s)); } catch (Exception ex) { try { - if (pattern != null) { - String zoneIdStr = ZoneId.systemDefault().getId(); - return parseInstant(s, pattern, localeStr, zoneIdStr); - } else if (s.length() > 0 && Character.isDigit(s.charAt(0))) { + if (isIsoFormat) { long timeMS = parse(s); if (timeMS != -1) { return Instant.ofEpochMilli(timeMS); @@ -523,6 +519,20 @@ public class TbDate implements Serializable, Cloneable { // The offset ID without colons or seconds. return getInstantWithLocalZoneOffsetId_RFC_1123(s); } + } catch (final DateTimeParseException e) { + final ConversionException exception = new ConversionException("Cannot parse value [" + s + "] as instant", e); + throw exception; + } + } + } + + private static Instant parseInstant(String s, String localeStr, String pattern) { + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, Locale.forLanguageTag(localeStr)); + return Instant.from(formatter.parse(s)); + } catch (Exception ex) { + try { + return parseInstant(s, pattern, localeStr, ZoneId.systemDefault().getId()); } catch (final DateTimeParseException e) { final ConversionException exception = new ConversionException("Cannot parse value [" + s + "] as instant", ex); throw exception; diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateConstructorTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateConstructorTest.java index 2dadf6adee..8a9d84b980 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateConstructorTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateConstructorTest.java @@ -44,7 +44,6 @@ public class TbDateConstructorTest { executionContext = new ExecutionContext(parserConfig, 5 * 1024 * 1024); } - @AfterAll public static void tearDown() { ParserContext.disableSandboxedMode();