Конвертиране между java.time.Instant и java.sql.Timestamp

1. Общ преглед

И двата java.time.Instant и java.sql.Timestamp класове представляват точка на времевата линия в UTC. С други думи, те представляват броя на наносекунди от епохата на Java.

В този бърз урок ще преобразуваме едното в другото, като използваме вградени Java методи.

2. Преобразуване на моментално в клеймо и обратно

Можем да използваме Timestamp.from (), за да конвертираме Instant s в Timestamps:

Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); assertEquals(instant.toEpochMilli(), timestamp.getTime());

И обратно, можем да използваме Timestamp.toInstant (), за да конвертираме Timestamp s в Instant s:

instant = timestamp.toInstant(); assertEquals(instant.toEpochMilli(), timestamp.getTime());

Така или иначе, както Instant, така и Timestamp представляват една и съща точка на времевата линия.

След това нека да разгледаме взаимодействието между двата класа и часовата зона.

3. Разлики в метода toString ()

Извикването на toString () на Instant и Timestamp се държи различно по отношение на часовата зона. Instant.toString () връща времето в часовата зона по UTC. От друга страна, Timezone.toString () връща времето в часовата зона на локалната машина.

Нека да видим какво получаваме при извикване на toString () съответно на момента и часовата зона :

Instant (in UTC): 2018-10-18T00:00:57.907Z Timestamp (in GMT +05:30): 2018-10-18 05:30:57.907

Тук timestamp.toString () доведе до време, което е 5 часа 30 минути след времето, върнато от instant.toString (). Това е така, защото часовата зона на локалната машина е GMT ​​+5: 30 часова зона.

Резултатът от метода toString () е различен, но както клеймото за време, така и моментът представляват една и съща точка на времевата линия .

Можем да проверим това и чрез преобразуване на клеймото за време в часовата зона на UTC:

DateFormat df = DateFormat.getDateTimeInstance(); df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SS'Z'"); df.setTimeZone(TimeZone.getTimeZone("UTC")); assertEquals(instant.toString(), df.format(timestamp).toString());

4. Заключение

В този бърз урок видяхме как да конвертираме между класовете java.time.Instant и java.sql.Timestamp в Java с помощта на вградени методи.

Също така имахме поглед върху това как часовата зона влияе върху промяната на изхода.

И както винаги, пълните примери за код са достъпни в GitHub.