«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.