Перейти к основному содержимому

Преобразование между строкой и отметкой времени

· 3 мин. чтения

1. Обзор

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

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

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

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

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

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

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

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

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

   | Шаблон    | Описание    | Пример   | 
| `гггг` | Представляет год, и для него обязательно должны быть четыре цифры. | 2018 |
| `м[м]` | Для компонента месяца у нас должна быть одна или две цифры (от 1 до 12). | 1, 11 |
| `д[д]` | Для значения дня месяца у нас должна быть одна или две цифры (от 1 до 31). | 7, 12 |
| `чч` | Обозначает час дня, с допустимыми значениями от 0 до 23. | 01, 16 |
| `мм` | Обозначает минуты часа с допустимыми значениями от 0 до 59. | 02, 45 |
| `SS` | Обозначает секунды в минутах с допустимыми значениями от 0 до 59. | 03, 52 |
| `[.ф…]` | Представляет необязательные доли секунды, может иметь точность до наносекунд, поэтому допустимые значения — от 0 до 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 в Java. Кроме того, мы увидели, как использовать преобразование LocalDateTime в качестве промежуточного шага для преобразования в различные шаблоны даты и времени и из них.

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