TimeComponents.toString() round to invalid time
The expression new TimeComponents(23, 59, 59.9999).toString()
produces the string "23:59:60.000" which contains a second number that is invalid most of the time. Tricky because rolling over would also be wrong and TimeComponents doesn't know how many seconds are valid in this particular minute. Perhaps truncate seconds numbers in [59.999, 60) and [60.999, 61) to avoid producing invalid times.