diff --git a/utils/src/main/java/org/zstack/utils/TimeUtils.java b/utils/src/main/java/org/zstack/utils/TimeUtils.java index f504d40a..482b7c9b 100644 --- a/utils/src/main/java/org/zstack/utils/TimeUtils.java +++ b/utils/src/main/java/org/zstack/utils/TimeUtils.java @@ -6,6 +6,7 @@ import java.text.DateFormat; import java.text.ParseException; +import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; @@ -142,22 +143,18 @@ public static long parseTimeToMillis(String time){ private static final String DEFAULT_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static boolean isValidTimestampFormat(String timestamp) { - try { - new SimpleDateFormat(DEFAULT_TIME_FORMAT).parse(timestamp); - return true; - } catch (ParseException e) { - return false; - } + return isValidTimestampFormat(timestamp, DEFAULT_TIME_FORMAT); } public static boolean isValidTimestampFormat(String timestamp, String dformat) { - try { - DateFormat dateFormat = new SimpleDateFormat(dformat); - dateFormat.parse(timestamp); - return true; - } catch (ParseException e) { + if (timestamp == null || dformat == null) { return false; } + + SimpleDateFormat dateFormat = new SimpleDateFormat(dformat); + dateFormat.setLenient(false); + ParsePosition position = new ParsePosition(0); + return dateFormat.parse(timestamp, position) != null && position.getIndex() == timestamp.length(); } public static long parseFormatStringToTimeStamp(String timestamp, String dformat) { diff --git a/utils/src/test/java/org/zstack/utils/test/TestTimeUtilsEdgeCases.java b/utils/src/test/java/org/zstack/utils/test/TestTimeUtilsEdgeCases.java new file mode 100644 index 00000000..55c4c82a --- /dev/null +++ b/utils/src/test/java/org/zstack/utils/test/TestTimeUtilsEdgeCases.java @@ -0,0 +1,23 @@ +package org.zstack.utils.test; + +import org.junit.Test; +import org.zstack.utils.TimeUtils; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class TestTimeUtilsEdgeCases { + @Test + public void testDefaultTimestampValidation() { + assertTrue(TimeUtils.isValidTimestampFormat("2024-02-29 10:00:00")); + assertFalse(TimeUtils.isValidTimestampFormat("2024-02-30 10:00:00")); + assertFalse(TimeUtils.isValidTimestampFormat("2024-01-01 10:00:00xyz")); + } + + @Test + public void testCustomTimestampValidation() { + assertTrue(TimeUtils.isValidTimestampFormat("2024/02/29", "yyyy/MM/dd")); + assertFalse(TimeUtils.isValidTimestampFormat("2024/02/30", "yyyy/MM/dd")); + assertFalse(TimeUtils.isValidTimestampFormat("2024/02/29 trailing", "yyyy/MM/dd")); + } +}