Tcl Source Code

Artifact [a311648345]
Login

Artifact a311648345cb8a10cea580763e22f99829c40c9b56fce5004a2f17552a7c41a1:

Attachment "00655c867eab.diff" to ticket [00655c867e] added by chrstphrchvz 2023-05-09 21:16:27.
diff --git generic/tclClock.c generic/tclClock.c
index d379762042..843541a99d 100644
--- generic/tclClock.c
+++ generic/tclClock.c
@@ -466,11 +466,13 @@ ClockGetdatefieldsObjCmd(
     }
 
     /*
-     * Extract Julian day.
+     * Extract Julian day. Always round the quotient down by subtracting 1
+     * when the remainder is negative (i.e. if the quotient was rounded up).
      */
 
-    fields.julianDay = (int) ((fields.localSeconds + JULIAN_SEC_POSIX_EPOCH)
-	    / SECONDS_PER_DAY);
+    fields.julianDay = (int) ((fields.localSeconds / SECONDS_PER_DAY) -
+	    ((fields.localSeconds % SECONDS_PER_DAY) < 0) +
+	    JULIAN_DAY_POSIX_EPOCH);
 
     /*
      * Convert to Julian or Gregorian calendar.
diff --git tests/clock.test tests/clock.test
index c30fea3b85..7d60977c31 100644
--- tests/clock.test
+++ tests/clock.test
@@ -18600,6 +18600,20 @@ test clock-7.9 {Julian Day, two values} {
     clock scan {2440588 2440589} -format {%J %J} -gmt true
 } 86400
 
+test clock-7.10 {Julian Day, negative amount} {
+    # Note: %J does not accept negative input;
+    # add negative amounts to Julian day 0 instead
+    set s0 [clock scan 0 -format %J -gmt true]
+    set J0 [scan [clock format $s0 -format %J -gmt true] %lld]
+    set s0m1d [clock add $s0 -1 days]
+    set s0m24h [clock add $s0 -24 hours]
+    set J0m24h [scan [clock format $s0m24h -format %J -gmt true] %lld]
+    set s0m1s [clock add $s0 -1 seconds]
+    set J0m1s [scan [clock format $s0m1s -format %J -gmt true] %lld]
+    list $s0m1d $s0m24h $J0m24h $s0m1s $J0m1s $s0 $J0 \
+	[::tcl::mathop::== $s0m1d $s0m24h] [::tcl::mathop::== $J0m24h $J0m1s]
+} [list -210866889600 -210866889600 -1 -210866803201 -1 -210866803200 0 1 1]
+
 # BEGIN testcases8
 
 # Test parsing of ccyymmdd