From c1d978d693041c07d64f40f50ccb29fc0b6af950 Mon Sep 17 00:00:00 2001 From: Evgen Bielozorov Date: Wed, 29 Jul 2026 16:03:06 +0200 Subject: [PATCH] fix: correct Minute/Second toString for negative values kdb+ minute and second values can be negative (e.g. the result of time arithmetic such as `neg 01:30`). Their toString rendered a minus sign on every component because Java integer division and remainder are both negative for a negative operand: Minute(-90) -> "-01:-30" (expected "-01:30") Second(-3661) -> "-01:-01:-01" (expected "-01:01:01") Apply the sign once and format the magnitude, mirroring how Timespan.toString already handles negatives. Extend the unit tests with negative and beyond-24h cases. --- javakdb/src/main/java/com/kx/c.java | 10 ++++++++-- javakdb/src/test/java/com/kx/CTest.java | 12 ++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/javakdb/src/main/java/com/kx/c.java b/javakdb/src/main/java/com/kx/c.java index 79374c1..f0b8a3f 100644 --- a/javakdb/src/main/java/com/kx/c.java +++ b/javakdb/src/main/java/com/kx/c.java @@ -497,7 +497,10 @@ public Minute(int x){ } @Override public String toString(){ - return i==ni?"":i2(i/60)+":"+i2(i%60); + if(i==ni) + return ""; + int a=Math.abs(i); + return (i<0?"-":"")+i2(a/60)+":"+i2(a%60); } @Override public boolean equals(final Object o){ @@ -527,7 +530,10 @@ public Second(int x){ } @Override public String toString(){ - return i==ni?"":new Minute(i/60).toString()+':'+i2(i%60); + if(i==ni) + return ""; + int a=Math.abs(i); + return (i<0?"-":"")+new Minute(a/60).toString()+':'+i2(a%60); } @Override public boolean equals(final Object o){ diff --git a/javakdb/src/test/java/com/kx/CTest.java b/javakdb/src/test/java/com/kx/CTest.java index 7660d4f..582c5d9 100644 --- a/javakdb/src/test/java/com/kx/CTest.java +++ b/javakdb/src/test/java/com/kx/CTest.java @@ -979,6 +979,12 @@ public void testMinuteToString() { c.Minute mon = new c.Minute(22); Assert.assertEquals("00:22", mon.toString()); + mon = new c.Minute(1500); + Assert.assertEquals("25:00", mon.toString()); // minute can exceed 24h + mon = new c.Minute(-30); + Assert.assertEquals("-00:30", mon.toString()); + mon = new c.Minute(-90); + Assert.assertEquals("-01:30", mon.toString()); mon = new c.Minute(Integer.MIN_VALUE); Assert.assertEquals("", mon.toString()); } @@ -1022,6 +1028,12 @@ public void testSecondToString() { c.Second mon = new c.Second(22); Assert.assertEquals("00:00:22", mon.toString()); + mon = new c.Second(90000); + Assert.assertEquals("25:00:00", mon.toString()); // second can exceed 24h + mon = new c.Second(-30); + Assert.assertEquals("-00:00:30", mon.toString()); + mon = new c.Second(-3661); + Assert.assertEquals("-01:01:01", mon.toString()); mon = new c.Second(Integer.MIN_VALUE); Assert.assertEquals("", mon.toString()); }