Java.время
Я рекомендую вам использовать java.time, современный API даты и времени Java, для вашей работы с датой и временем.
DateTimeFormatter isoFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxx");
DateTimeFormatter sqlTimestampFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter();
String aTimestampString = "2020-12-03T05:35:59.398+0000";
String anotherTimestampString = "2020-12-04 06:43:58.556385";
Instant anInstant = isoFormatter.parse(aTimestampString, Instant::from);
Instant anotherInstant = LocalDateTime.parse(anotherTimestampString, sqlTimestampFormatter)
.atOffset(ZoneOffset.UTC)
.toInstant();
if (anInstant.isBefore(anotherInstant)) {
System.out.println(aTimestampString + " is earlier");
} else {
System.out.println(anotherTimestampString + " is earlier");
}
Выход из этого примера:
2020-12-03T05:35:59.398+0000 раньше
+0000
в предыдущей строке выше — это смещение от UTC — смещение на 00 часов 00 минут. Поскольку он равен нулю, мы знаем, что время указано в формате UTC. Я не знаю часовой пояс или смещение UTC другой строки. Вам нужно знать, иначе вы получите неправильные результаты. В приведенном выше коде я предположил, что другая строка также находится в формате UTC.
Не используйте метку времени
Я попробовал ответ, данный здесь, и преобразование действительно произошло, но время было изменено на 2020-12-03 11:05:59
Вот как сбивает с толку класс Timestamp
. Вы получили правильное значение метки времени. Что происходит, когда вы распечатываете объект Timestamp
, так это то, что вы (неявно или явно) вызываете его метод toString
. Timestamp.toString()
сбивает с толку часовой пояс вашей JVM по умолчанию для рендеринга строки. Таким образом, если ваша временная метка равна 2020-12-03T05:35:59.398 UTC, а ваш часовой пояс, скажем, Азия/Калькутта, тогда время преобразуется в часовой пояс Азии/Калькутты, а строка 2020-12-03 11:05:59
возвращается и печатается.
У вас нет ничего хорошего, для чего можно было бы использовать старомодный класс java.sql.Timestamp
. Первоначально он предназначался для передачи значений меток времени с часовым поясом и без него в базы данных SQL и из них. Начиная с JDBC 4.2 мы предпочитаем для этой цели OffsetDateTime
, Instant
и LocalDateTime
. Так что просто забудьте о классе Timestamp
.
Ссылка на сайт
учебное пособие по Oracle: дата и время, объясняющее, как использовать java.time.
person
Ole V.V.
schedule
04.12.2020
Timestamp
? Этот класс плохо и запутанно разработан и давно устарел. Если вы сообщите нам, откуда вы взяли другиеTimestamp
, мы сможем предложить лучшие альтернативы, заменяя (или преобразовывая) классы из java.time, современный API даты и времени Java, например,OffsetDateTIme
. - person Ole V.V.   schedule 04.12.2020String
, и вы хотите преобразовать их в тип даты/времени, чтобы вызвать для них методы сравнения. Это правильно? Если это так, я бы рекомендовал использовать библиотекуjava.time
и держаться подальше отjava.sql.Timestamp
, которая представляет собой тонкую обертку вокруг старой и устаревшей библиотекиjava.util.Date
. - person jwvh   schedule 04.12.20202020-12-03 11:05:59
. Нет, не меняли. Он был только что напечатан в вашем часовом поясе (вероятно, Азия/Калькутта). - person Ole V.V.   schedule 04.12.2020