Вы используете ужасные классы даты и времени, которые были go заменены современными java .time классами с принятием JSR 310.
Вы должны быть получение значений даты и времени из базы данных в виде объектов даты и времени, а не строк. Начиная с JDB C 4.2, мы можем обмениваться классами java .time с базой данных. См. PreparedStatement::setObject
и ResultSet::getObject
.
Для столбца базы данных типа:
TIMESTAMP WITH TIME ZONE
, получить как OffsetDateTime
(поддержка более часто используемых классов Instant
и ZonedDateTime
был, к сожалению, таинственным образом исключен из JDB C 4.2).
TIMESTAMP WITHOUT TIME ZONE
, получить как LocalDateTime
.
Если вы столкнулись со строковым вводом, выполните синтаксический анализ с использованием класса DateTimeFormatter
.
В вашем вводе отсутствует индикатор часового пояса или смещение от UT C. Поэтому мы должны разобрать как LocalDateTime
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu/MM/dd HH.mm.ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
Для захвата текущего момента требуется часовой пояс. В любой момент дата и время суток меняются в зависимости от зоны земного шара.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
Мы не можем сравнить этот текущий момент (zdt
) с вашим вводом, ldt
. Ваш ввод и объект LocalDateTime
не представляют момент, не являются определенной точкой c на временной шкале. Возьмем, к примеру, 2020/05/17 18.30.44
. Мы не можем знать, означает ли это 18:30 17-го числа в Токио, Тулузе или Толедо - все это разные моменты, с интервалом в несколько часов на временной шкале.
Итак, ваш вопрос, как написано, не может быть решен.
Если вы точно знаете, что часовой пояс был предназначен для вашей входной строки, примените часовой пояс, чтобы получить ZonedDateTime
.
ZoneId zIntended = ZoneOf.( "Africa/Tunis" ) ;
ZonedDateTime then = ldt.atZone( zIntended ) ;
Вычислить прошедшее время как Duration
.
Duration d = Duration.between( now , then ) ;
if( d.toHours() > 120 ) { … }