Postgres timestamps are up to microseconds resolution. This can be seen here in the Postgres V13 docs . This means that if you are trying to save a ZonedDateTime type into to the DB, you should cut-off the Nano-seconds portion of the time. Otherwise, if you save a time with Nano secs, and you read that time back from the DB, you will have different times. This is because the time from the DB is missing the nano-secs. So how does one go about doing this? Rounding Nanoseconds Essentially do to this, first need to get the nano secs of the second via: Integer nanoSecs = zonedDateTime .get( ChronoField . NANO_OF_SECOND ) ; This amount now has to be converted to micro-secs by dividing by 1000. This removes the nano-seconds the amount. Don't forget that the nano-secs that we just removed by dividing may be more then 500. In which case you should add 1 to the microseconds. Then we need to multiply by 1000 to get the amount back in nano-secs. By doing this we turn all the nano-secs to ZERO...
Rasul's thoughts, code and spelling mistakes