@@ -191,33 +191,31 @@ get_data_checksum_version(bool safe)
191191
192192
193193/*
194- * Convert time_t value to ISO-8601 format string
194+ * Convert time_t value to ISO-8601 format string. Always set timezone offset.
195195 */
196196void
197197time2iso (char * buf , size_t len , time_t time )
198198{
199199 struct tm * ptm = gmtime (& time );
200200 time_t gmt = mktime (ptm );
201201 time_t offset ;
202+ char * ptr = buf ;
202203
203204 ptm = localtime (& time );
204205 offset = time - gmt + (ptm -> tm_isdst ? 3600 : 0 );
205206
206- strftime (buf , len , "%Y-%m-%d %H:%M:%S" , ptm );
207+ strftime (ptr , len , "%Y-%m-%d %H:%M:%S" , ptm );
207208
208- if (offset != 0 )
209- {
210- buf += strlen (buf );
211- sprintf (buf , "%c%02d" ,
212- (offset >= 0 ) ? '+' : '-' ,
213- abs ((int ) offset ) / SECS_PER_HOUR );
209+ ptr += strlen (ptr );
210+ snprintf (ptr , len - (ptr - buf ), "%c%02d" ,
211+ (offset >= 0 ) ? '+' : '-' ,
212+ abs ((int ) offset ) / SECS_PER_HOUR );
214213
215- if (abs ((int ) offset ) % SECS_PER_HOUR != 0 )
216- {
217- buf += strlen (buf );
218- sprintf (buf , ":%02d" ,
219- abs ((int ) offset % SECS_PER_HOUR ) / SECS_PER_MINUTE );
220- }
214+ if (abs ((int ) offset ) % SECS_PER_HOUR != 0 )
215+ {
216+ ptr += strlen (ptr );
217+ snprintf (ptr , len - (ptr - buf ), ":%02d" ,
218+ abs ((int ) offset % SECS_PER_HOUR ) / SECS_PER_MINUTE );
221219 }
222220}
223221
0 commit comments