Не сравнивает время до 10 утра - PullRequest
0 голосов
/ 28 июня 2018

Я делаю сравнение времени в цикле. Поэтому он проверяет все время, сохраненное в формате HH:mm, а затем выполняет другие инструкции.
Если я пытаюсь сравнить время между 00:00 и 09:59, это выдает ошибку. Что я могу сделать?

for(int contatore = 0; lista_allarmi.moveToNext() ; contatore++) {
    Date ORANOTIFICA;
    ID_M = lista_allarmi.getInt(0);
    NOME_M = lista_allarmi.getString(1);
    TIPO_M = lista_allarmi.getString(2);
    String ora_notifica = lista_allarmi.getString(3);
    parts = ora_notifica.split(":");
    hrs = Integer.parseInt(parts[0]); // ore
    min = Integer.parseInt(parts[1]); // minuti
    ora_allm.set(Calendar.HOUR_OF_DAY,hrs);
    ora_allm.set(Calendar.MINUTE, min);
    ora_allm.set(Calendar.SECOND, 0);
    ora_allm_piut = ora_allm;
    ora_allm_piut.add(Calendar.MINUTE, 5);
    hrs = ora_allm_piut.get(Calendar.HOUR_OF_DAY);
    min = ora_allm_piut.get(Calendar.MINUTE);
    HPT = String.valueOf(hrs);
    MPT = String.valueOf(min);
    ORARNPT = HPT + ":" + MPT; ORANOTIFICAPIUTIMER;
    Date ora_attuale = Calendar.getInstance().getTime();
    Date ORARIOATT;

    i = new Intent(getContext(), AlarmReceiver.class);
    i.putExtra("id", ID_M);
    i.putExtra("NMM", NOME_M);
    i.putExtra("TPM", TIPO_M);
    pi = PendingIntent.getBroadcast(getContext(), contatore, i, PendingIntent.FLAG_UPDATE_CURRENT);
    if(LocalTime.now().isAfter(parse(ora_notifica)) && LocalTime.now().isBefore(parse(ORARNPT))) {
         //A
    } else {
         //B
    }
}

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Я забыл добавить "0", когда час, проведенный с Календарем. HOUR_OF_DAY был <= 9: </p>

hrs=ora_allm_piut.get(Calendar.HOUR_OF_DAY);
min=ora_allm_piut.get(Calendar.MINUTE);
if(hrs<=9){HPT=String.valueOf("0"+hrs);

Теперь время относится к формату времени, и я могу сделать сравнение.

0 голосов
/ 29 июня 2018

ТЛ; др

LocalTime.parse(
    "9:25" ,
    DateTimeFormatter.ofPattern( "H:m" )
)
.isBefore(
    LocalTime.of( 10 , 0 ) 
)

Вы используете неправильные классы

Никогда не используйте ужасно хлопотные старые классы даты и времени в комплекте с самыми ранними версиями Java. Теперь они унаследованы и полностью заменены классами java.time , встроенными в Java 8 и более поздние версии. Избегайте Date, Calendar и SimpleDateFormat в целом.

Формат должен соответствовать вводу

ЧЧ: формат мм

...

java.time.format.DateTimeParseException: текст '9:25' не может быть проанализирован с индексом 0

Ваш шаблон форматирования говорит HH, что означает двузначное значение. Для часов 1-9 ожидается начальный нулевой отступ. Ваш ввод 9:25 пропускает его нулевой отступ.

Для такого ввода используйте один H. И, вероятно, минутам не хватает нуля, так что используйте там тоже m.

DateTimeFormatter.ofPattern ("H: m")

Не работай так усердно

Классы java.time проанализируют ваши строковые входные данные для вас. Не нужно анализировать текст самостоятельно.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "H:m" ) ;
LocalTime lt = LocalTime.parse( "9:25" , f ) ;

Half-Open

сравнить время между 00:00 и 09: 59,

При определении промежутка времени подход Half-Open обычно является наилучшим. При таком подходе начало считается включительно , а окончание исключительно . Это означает, что час 9 утра начинается в 09:00 и продолжается, но не включает первый момент следующего часа, 10:00.

Одним из преимуществ Half-Open является то, что вы избегаете попыток прибить вечно делимый последний момент часа. Последний момент 09:59? 09: 59,9? 09: +59,999999999? Чтобы избежать всей катастрофы, вместо этого спросите: «Есть ли момент до 10 утра?».

Только для времени суток, без контекста даты, часы останавливаются в полночь. Поэтому, если вы хотите спросить, является ли определенное время дня между полуночью и 10:00, вам нужно только спросить, наступило ли это до 10:00.

LocalTime stop = LocalTime.of( 10 , 0 );
LocalTime x = LocalTime.parse( "09:25" ) ;
Boolean isEarlyEnough = x.isBefore( stop ) ;

Возможно, вы хотите использовать время начала, отличное от первого момента дня. В этом случае укажите начало и остановку.

LocalTime start = LocalTime.MIN ;  // Constant for 00:00:00.000000000.
LocalTime stop = LocalTime.of( 10 , 0 );
LocalTime x = LocalTime.parse( "09:25" ) ;
Boolean isEarlyEnoughButNotTooEarly = ( ! x.isBefore( start ) ) &&  x.isBefore( stop ) ;  // "Not before" is a briefer way of saying "Is equal to or later than".

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

The ThreeTen-Extra Проект расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

...