«1. Обзор

Timestamp — один из немногих устаревших объектов даты и времени в Java.

В этом уроке мы увидим, как преобразовать значение String в объект Timestamp и как преобразовать объект Timestamp в строку.

А поскольку Timestamp использует собственный формат Java, мы посмотрим, как эффективно адаптироваться.

2. Разобрать строку по отметке времени

2.1. Стандартный формат

Самый простой способ преобразовать строку в временную метку — использовать ее метод valueOf:

Timestamp.valueOf("2018-11-12 01:02:03.123456789")

И когда наша строка имеет формат временной метки JDBC — гггг-м[м]-д[д] чч :mm:ss[.f…] — тогда это довольно просто.

Мы можем интерпретировать этот шаблон следующим образом:

Pattern Description Example
yyyy Represents the year, and it’s mandatory to have four digits for it. 2018
m[m] For the month component, we must have either one or two digits (from 1 to 12). 1, 11
d[d] For the day of month value, we must have either one or two digits (from 1 to 31). 7, 12
hh Stands for the hour of the day, with allowed values from 0 to 23. 01, 16
mm Stands for minutes of the hour, with allowed values from 0 to 59. 02, 45
ss Stands for seconds in the minute, with allowed values from 0 to 59. 03, 52
[.f…] Represents optional fractions of a second, can be up to nanoseconds precision so the allowed values are from 0 to 999999999. 12, 1567, 123456789

2.2. Альтернативные форматы

Теперь, если это не формат метки времени JDBC, то, к счастью, valueOf также принимает экземпляр LocalDateTime.

Это означает, что мы можем взять дату в любом формате, нам просто нужно сначала преобразовать ее в LocalDateTime:

String pattern = "MMM dd, yyyy HH:mm:ss.SSSSSSSS";
String timestampAsString = "Nov 12, 2018 13:02:56.12345678";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
LocalDateTime localDateTime = LocalDateTime.from(formatter.parse(timestampAsString));

И затем мы можем использовать valueOf, который мы сделали раньше:

Timestamp timestamp = Timestamp.valueOf(localDateTime);
assertEquals("2018-11-12 13:02:56.12345678", timestamp.toString());

Примечание мимоходом что, в отличие от объекта Date, объект Timestamp может хранить доли секунды.

3. Форматирование временной метки как строки

Чтобы отформатировать временную метку, у нас будет та же проблема, поскольку ее формат по умолчанию является собственным форматом временной метки JDBC:

assertEquals("2018-11-12 13:02:56.12345678", timestamp.toString());

Но, опять же, с использованием посредника преобразование, мы можем отформатировать результирующую строку в другой шаблон даты и времени, например стандарт ISO-8601:

Timestamp timestamp = Timestamp.valueOf("2018-12-12 01:02:03.123456789");
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
 
String timestampAsString = formatter.format(timestamp.toLocalDateTime());
assertEquals("2018-12-12T01:02:03.123456789", timestampAsString);

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

В этой статье мы увидели, как преобразовать между объектами String и Timestamp в Ява. Кроме того, мы увидели, как использовать преобразование LocalDateTime в качестве промежуточного шага для преобразования в различные шаблоны даты и времени и из них.

И не забудьте найти все эти примеры и фрагменты на GitHub.