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 .