Получить время от даты и базы данных, а затем сравнить это время в Java - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть дата: actDate , и его время было извлечено как строка timeFromAct

Тогда у меня есть справочное время из базы данных: timeValue , это было преобразовано в строку как timeFromDB

DateFormat formatTime;
formatTime = new SimpleDateFormat("HH:mm:ss");  
Date actDate = actinfo.getActDate();
String timeFromAct = formatDay.format(actDate);

String date= ListOfConstants.SOME_DATE_REF;
ResultTable[] timeValue = RTManager.getSomethingDecodeList(date);
String timeFromDB = Arrays.toString(timeValue);

Я знаю, что преобразование двух, так как строки не позволят мне сравнить 2 раза, но

Я хотел бы знать, как сравнить эти значения времени в операторе if (аналогично приведенному ниже сравнению)?

if (timeFromAct is greater than or equal to timeFromDB){
*some codes*
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

LocalTime от java.time

    Date actDate = actinfo.getActDate();
    ResultTable[] timeValue = RTManager.getSomethingDecodeList(date);

    LocalTime actualTime = actDate.toInstant()
            .atZone(ZoneId.systemDefault())
            .toLocalTime();
    if (timeValue.length == 1) {
        LocalTime timeFromDB = LocalTime.parse(timeValue[0].toString());
        if (! actualTime.isBefore(timeFromDB)) {
            System.out.println("timeFromAct is greater than or equal to timeFromDB");
        } else {
            System.out.println("timeFromAct is less than timeFromDB");
        }
    } else {
        System.out.println("Unexpected number of ResultTable entries: " + timeValue.length);
    }

A LocalTime - это время суток без даты и без часового пояса. Я считаю, что это именно то, что вам нужно.

Я предположил, что getActDate неизменно возвращает объект Date со старым фоном. Было бы лучше, если бы вы могли изменить его так, чтобы он возвращал соответствующий тип из java.time, современного Java-API даты и времени.

При преобразовании из Date в LocalTime в вышеприведенном коде вам нужно будет правильно указать часовой пояс, иначе вы получите неправильные результаты. Я предварительно предположил настройку часового пояса JVM, обозначенную как ZoneId.systemDefault(), так как SimpleDateFormat в вашем вопросе использовал это; но это хрупко, так как настройку можно изменить из другой части вашей программы или из другой программы, работающей в той же JVM. Лучше, если вы можете указать правильный часовой пояс, например, ZoneId.of("Asia/Manila").

Проверьте свои предположения. RTManager.getSomethingDecodeList обязательно вернет только 1 значение, например: [23:32:45]. Проверка стоит так дешево, и будет сложно отследить ошибку, если когда-нибудь новый программист в вашем проекте модифицирует ее, чтобы вернуть массив другой длины. Помогите, выдав полезное сообщение об ошибке в этом случае.

Используемые вами классы даты и времени - DateFormat, SimpleDateFormat и Date - давно устарели и плохо разработаны. Первые два в частности известны тем, что были хлопотными. Я не вижу причин, по которым вам стоит использовать какой-либо из них, если вы можете избежать этого.

к сожалению, я не могу импортировать java.time, откуда я делаю коды.

Если вы используете хотя бы Java 6, вы можете использовать java.time.

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от 26 уровня API, как мне сказали) современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старой) версии Android используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 04 сентября 2018

Напишите так;

if (actDate.after(timeFromDb) || actDate.compareTo(timeFromDB)==0 ){
*some codes*
}

Подробно

  • actDate.after(timeFromDb) обеспечивает больше, чем регистр.
  • actDate.compareTo(timeFromDB)==0 обеспечивает равенство actDate и timeFormDb.

Или в строковом сравнении, если оба имеют одинаковый формат;

if(timeFromAct.compareTo(timeFromDB) > 0 || timeFromAct .equals(timeFromDB)){..}

или более простой

if(!(timeFromAct.compareTo(timeFromDB) < 0)){..}

String.compareTo работает как

"a".compareTo("b"); // returns a negative number, here -1
"a".compareTo("a"); // returns  0
"b".compareTo("a"); // returns a positive number, here 1
...