Как рассчитать оставшееся время до установленного времени - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу создать приложение, подобное Alarm в Android (Java), я хочу подсчитать, сколько осталось часов и минут.Когда я установил будильник на 1:00 утра.Мое текущее время - 20:00. Появится сообщение «Будильник прозвучит через 5 часов», но через 19 часов будет показано, как его решить.

Toast.makeText(this, "Hours: " + (calendar.getTime().getHours() - timePicker.getCurrentHour()) + "Minutes: " + (calendar.getTime().getMinutes() - timePicker.getCurrentMinute()) , Toast.LENGTH_SHORT).show();

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

java.time

Современное решение использует классы java.time .

Получить текущий момент в вашем часовом поясе по умолчанию.Если важно, подтвердите с пользователем.

ZoneId z = ZoneId.systemDefault() ; 
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Извлечь время суток.

LocalTime lt = zdt.toLocalTime() ;

Если по истечении времени будильника добавить день.

LocalTime alarm = LocalTime.of( 1 , 0 ) ;

LocalDate ld = zdt.toLocalDate() ;
if( ! alarm.isBefore( lt ) ) {
    ld = ld.plusDays( 1 ) ;
}

ZonedDateTime fire = ZonedDateTime.of( ld , alarm , z ) 

Если вашему другому коду требуется UTC, извлеките Instant

Instant instant = fire.toInstant() ;

Рассчитайте истекшее время.

Duration d = Duration.between( zdt , fire ) ; 
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;

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


About 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?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

0 голосов
/ 30 декабря 2018

попробуйте что-то вроде этого:

    Calendar cal = Calendar.getInstance();

    int hrs = cal.get(Calendar.HOUR_OF_DAY);

    Calendar alCal = Calendar.getInstance();
    alCal.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());

    alCal.set(Calendar.MINUTE, timePicker.getCurrentMinute());

    if(timePicker.getCurrentHour() < hrs){
        alCal.add(Calendar.DAY_OF_MONTH, 1);
    }

    long diff = alCal.getTimeInMillis() - cal.getTimeInMillis();

    long leftHrs = (diff / (60 * 60 * 1000));
    long leftMin = (diff / (60 * 1000)) - (leftHrs * 60);

    // Output
    Toast.makeText(this,"Hours: "+leftHrs+"Minutes: "+leftMin,Toast.LENGTH_SHORT).show();
0 голосов
/ 29 декабря 2018

Вы должны использовать Java Date.

Calendar cal = Calendar.getInstance().set(...); //set the date
Date alarmDate = cal.time;

long duration = alarmDate - System.currentTimeMillis();
int hours = duration / (1000 * 60 * 60);
...