Skip to content

java.sql.Timestamp not persisted with full precision #889

@purpledrazi

Description

@purpledrazi

Describe the bug
java.sql.Timestamp supports nanosecond precision, but data is truncated to milliseconds after being serialised and deserialised.

To Reproduce

import static org.assertj.core.api.Assertions.assertThat;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.sql.Timestamp;
import java.time.Instant;

import org.junit.jupiter.api.Test;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

class KryoTimestampTest {

  @Test
  void timestampRoundtrip() {
    
    var k = new Kryo();
    k.setRegistrationRequired(false);
    
    var bytes = new ByteArrayOutputStream();
    
    var originalTimestamp  = new Timestamp(Instant.parse("2022-03-16T17:03:05Z").toEpochMilli());
    originalTimestamp.setNanos(123456789);
    
    assertThat(originalTimestamp.toInstant()).isEqualTo(Instant.parse("2022-03-16T17:03:05.123456789Z"));
    
    try(var out = new Output(bytes)) {
      k.writeClassAndObject(out, originalTimestamp);
    }
    
    try(var in = new Input(new ByteArrayInputStream(bytes.toByteArray()))) {
      var deserialisedTimestamp = (Timestamp) k.readClassAndObject(in);
      assertThat(deserialisedTimestamp.toInstant()).isEqualTo(Instant.parse("2022-03-16T17:03:05.123456789Z"));
    }
  }
}

Environment:

  • OS: Debian
  • JDK Version: 17.0.2
  • Kryo Version: 5.3.0

Additional context
None

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions