Fossil SCM

Fix the fossil_roundup_date() function so that it also rounds up dates with milliseconds at the end.

drh 2026-04-16 11:47 UTC trunk
Commit 5298941066616b332e234a2ae733aa27caaf2e50bd57d2a563800bb589c186b2
1 file changed +24 -3
+24 -3
--- src/name.c
+++ src/name.c
@@ -182,23 +182,44 @@
182182
int addZ = 0;
183183
if( n>10 && (zDate[n-1]=='z' || zDate[n-1]=='Z') ){
184184
n--;
185185
addZ = 1;
186186
}
187
- if( n==19 ){ /* YYYY-MM-DD HH:MM:SS */
187
+ if( n>=21 && n<=23 ){ /* YYYY-MM-DD HH:MM:SS.SSS */
188
+ memcpy(zUp, zDate, n);
189
+ while( n<23 ) zUp[n++] = '9';
190
+ /* If milliseconds is less than 999, round up to the next millisecond */
191
+ if( strcmp(&zUp[20],"999")<0 ){
192
+ if( zUp[22]<='9' ){
193
+ zUp[22]++;
194
+ }else{
195
+ zUp[22] = 0;
196
+ if( zUp[21]<'9' ){
197
+ zUp[21]++;
198
+ }else{
199
+ zUp[21] = 0;
200
+ zUp[20]++;
201
+ }
202
+ }
203
+ }
204
+ if( addZ ) zUp[n++] = 'z';
205
+ zUp[n] = 0;
206
+ return zUp;
207
+ }
208
+ if( n==19 ){ /* YYYY-MM-DD HH:MM:SS */
188209
memcpy(zUp, zDate, 19);
189210
memcpy(zUp+19, ".999z", 6);
190211
if( !addZ ) zUp[23] = 0;
191212
return zUp;
192213
}
193
- if( n==16 ){ /* YYYY-MM-DD HH:MM */
214
+ if( n==16 ){ /* YYYY-MM-DD HH:MM */
194215
memcpy(zUp, zDate, 16);
195216
memcpy(zUp+16, ":59.999z", 8);
196217
if( !addZ ) zUp[23] = 0;
197218
return zUp;
198219
}
199
- if( n==10 ){ /* YYYY-MM-DD */
220
+ if( n==10 ){ /* YYYY-MM-DD */
200221
memcpy(zUp, zDate, 10);
201222
memcpy(zUp+10, " 23:59:59.999z", 14);
202223
if( !addZ ) zUp[23] = 0;
203224
return zUp;
204225
}
205226
--- src/name.c
+++ src/name.c
@@ -182,23 +182,44 @@
182 int addZ = 0;
183 if( n>10 && (zDate[n-1]=='z' || zDate[n-1]=='Z') ){
184 n--;
185 addZ = 1;
186 }
187 if( n==19 ){ /* YYYY-MM-DD HH:MM:SS */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188 memcpy(zUp, zDate, 19);
189 memcpy(zUp+19, ".999z", 6);
190 if( !addZ ) zUp[23] = 0;
191 return zUp;
192 }
193 if( n==16 ){ /* YYYY-MM-DD HH:MM */
194 memcpy(zUp, zDate, 16);
195 memcpy(zUp+16, ":59.999z", 8);
196 if( !addZ ) zUp[23] = 0;
197 return zUp;
198 }
199 if( n==10 ){ /* YYYY-MM-DD */
200 memcpy(zUp, zDate, 10);
201 memcpy(zUp+10, " 23:59:59.999z", 14);
202 if( !addZ ) zUp[23] = 0;
203 return zUp;
204 }
205
--- src/name.c
+++ src/name.c
@@ -182,23 +182,44 @@
182 int addZ = 0;
183 if( n>10 && (zDate[n-1]=='z' || zDate[n-1]=='Z') ){
184 n--;
185 addZ = 1;
186 }
187 if( n>=21 && n<=23 ){ /* YYYY-MM-DD HH:MM:SS.SSS */
188 memcpy(zUp, zDate, n);
189 while( n<23 ) zUp[n++] = '9';
190 /* If milliseconds is less than 999, round up to the next millisecond */
191 if( strcmp(&zUp[20],"999")<0 ){
192 if( zUp[22]<='9' ){
193 zUp[22]++;
194 }else{
195 zUp[22] = 0;
196 if( zUp[21]<'9' ){
197 zUp[21]++;
198 }else{
199 zUp[21] = 0;
200 zUp[20]++;
201 }
202 }
203 }
204 if( addZ ) zUp[n++] = 'z';
205 zUp[n] = 0;
206 return zUp;
207 }
208 if( n==19 ){ /* YYYY-MM-DD HH:MM:SS */
209 memcpy(zUp, zDate, 19);
210 memcpy(zUp+19, ".999z", 6);
211 if( !addZ ) zUp[23] = 0;
212 return zUp;
213 }
214 if( n==16 ){ /* YYYY-MM-DD HH:MM */
215 memcpy(zUp, zDate, 16);
216 memcpy(zUp+16, ":59.999z", 8);
217 if( !addZ ) zUp[23] = 0;
218 return zUp;
219 }
220 if( n==10 ){ /* YYYY-MM-DD */
221 memcpy(zUp, zDate, 10);
222 memcpy(zUp+10, " 23:59:59.999z", 14);
223 if( !addZ ) zUp[23] = 0;
224 return zUp;
225 }
226

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button