How do I make java.sql.Timestamp UTC time? [duplic

2019-04-30 02:41发布

问题:

This question already has an answer here:

  • Is java.sql.Timestamp timezone specific? 4 answers
public static void main(String[] args) {

    LocalDateTime ldt = LocalDateTime.now();

    ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());

    Instant instant = Instant.from(zdt);

    Timestamp timestamp = Timestamp.from(instant);

    System.out.println(ldt + "\n");

    System.out.println(zdt + "\n");

    System.out.println(instant + "\n");

    System.out.println(timestamp + "\n");
}

And it prints:

2017-05-07T18:13:26.969

2017-05-07T18:13:26.969-04:00[America/New_York]

2017-05-07T22:13:26.969Z

2017-05-07 18:13:26.969

How can I make an SQL Timestamp save with the same time as the Instant? I need to be able to get the Timestamp from anywhere and convert it to whatever time it happens to be in that part of the world. The problem is that it keeps saving as the same time as whatever my system clock happens to be set at.

回答1:

You are best to get a Timestamp from a LocalDateTime, rather than from an Instant.

The first step is to take your ZonedDateTime and convert it to GMT:

ZonedDateTime gmt = zdt.withZoneSameInstant(ZoneId.of("GMT"));

Then you can convert it to a Timestamp via a LocalDateTime:

Timestamp timestamp = Timestamp.valueOf(gmt.toLocalDateTime());


回答2:

You might need to use the specific overload of setTimestamp that takes a Calendar object if you want to represent a "TIMESTAMP WITH TIME ZONE" value.