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. This way when it is saved in the DB, the timestamp saved and then read are the same.
Comments
Post a Comment