БД и java сравнение даты и даты - PullRequest
0 голосов
/ 29 мая 2020

Я получаю переменную newValue в java как

public void reTrigger() {
    Date date1 = new Date();
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH.mm.ss");

    squery: "select newValue from SAVE_TXN WHERE ROWID = 1"
(newValue is of type nvarchar2)

    String vidtime = sdf.format(parser.getValueOf("newValue")); //parser is another method which parses the squery 
String currentDate = sdf.format(date1);
}

Теперь новое значение содержит дату и время, например: '2020/05/17 18.30.44' в БД, которые я загружаю в vidtime.

Теперь я хочу вычесть это vidtime с currentDate в java и проверить, больше ли оно или равно 120 часам или нет. Как действовать ?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Вы используете ужасные классы даты и времени, которые были 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 ) { … }
1 голос
/ 29 мая 2020

Может быть примерно так:

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test {
    public static void main(String[] args) {
        final LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        final LocalDateTime dateToCompare = LocalDateTime.parse("2020-05-28 02:05:45",formatter);
        final long hours = Duration.between(now, dateToCompare).toHours();
        System.out.print(hours);
    }
}
...