Получить время до моего указанного времени в Android - PullRequest
0 голосов
/ 01 ноября 2018

Я создаю приложение для будильника, которое должно показывать время до следующего будильника. В моем распоряжении текущее время и часы: минуты: значения AM / PM и день недели, например, 3:15 вт. Как я могу вычислить это? Все, что меня интересует, это напечатать это так: 07h 35m.

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

EDIT:

Моя проблема в том, что мое время установлено в соответствии с моими пользовательскими представлениями, такими как 3:15 во вторник. Мне нужно преобразовать его в ближайший объект Date. Так, например, когда сегодня вторник, а сейчас 2:00 утра, я просто отредактирую время, но когда сегодня пятница, мне нужно добавить несколько дней и времени.

Ответы [ 4 ]

0 голосов
/ 01 ноября 2018

Попробуйте это:

    SimpleDateFormat format = new SimpleDateFormat("hh:mm a EEE", Locale.ENGLISH);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(format.parse("3:15 AM Tue").getTime());

    Calendar now = Calendar.getInstance();
    Calendar target = Calendar.getInstance();

    if (calendar.get(Calendar.DAY_OF_WEEK) > now.get(Calendar.DAY_OF_WEEK)) {
        target.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
        target.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
        target.add(Calendar.DATE, calendar.get(Calendar.DAY_OF_WEEK) - now.get(Calendar.DAY_OF_WEEK));
    } else if (calendar.get(Calendar.DAY_OF_WEEK) < now.get(Calendar.DAY_OF_WEEK)) {
        target.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
        target.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
        target.add(Calendar.DATE, 7 - (now.get(Calendar.DAY_OF_WEEK) - calendar.get(Calendar.DAY_OF_WEEK)));
    } else {
        if (calendar.get(Calendar.HOUR_OF_DAY) > now.get(Calendar.HOUR_OF_DAY)) {
            target.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
            target.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
        } else if (calendar.get(Calendar.HOUR_OF_DAY) < now.get(Calendar.HOUR_OF_DAY)) {
            target.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
            target.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
            target.add(Calendar.DATE, 7);
        } else {
            if (calendar.get(Calendar.MINUTE) > now.get(Calendar.MINUTE)) {
                target.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
                target.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
            } else if (calendar.get(Calendar.MINUTE) < now.get(Calendar.MINUTE)) {
                target.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
                target.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
                target.add(Calendar.DATE, 7);
            } else {
                // target time is now!
            }
        }
    }

    long remainingTime = target.getTimeInMillis() - now.getTimeInMillis();
    final long hr = TimeUnit.MILLISECONDS.toHours(remainingTime);
    final long min = TimeUnit.MILLISECONDS.toMinutes(remainingTime - TimeUnit.HOURS.toMillis(hr));
    String result =  String.format("%02d:%02d", hr, min);
0 голосов
/ 01 ноября 2018

Работа с миллисом должна работать руками вниз. Имейте в виду, что 1000 миллисекунд = 1 сек. Сделайте математику, а затем преобразуйте результат в нужный формат, используя SimpleDateFormat. Также при использовании dates убедитесь, что вы импортируете java.util.Date, а не sql.Date.

PS: Как получить Date из вашей строки:

    String TimeStringToConvertToActualDate;   //  Let's assume this is the string holding your time and you want to convert it to a date
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   // Here you should write the format you are actually using instead of this one
    Date myDate = null;
    try {
       myDate= sdf.parse(TimeStringToConvertToActualDate);
    } catch (ParseException e) {
       e.printStackTrace();
    }
0 голосов
/ 01 ноября 2018

Вы можете использовать Календарь класс и работать только с миллис.

Следующий код меняет время или дни месяца:

Calendar c = Calendar.getInstance();
c.add(Calendar.HOUR_OF_DAY, 1);
c.add(Calendar. DAY_OF_MONTH, 1);

Вы можете получить Дата объект, используя метод getTime(), когда вам нужно.

0 голосов
/ 01 ноября 2018

Чтобы преобразовать подобную строку в объект фактической даты, вы можете использовать код, подобный следующему:

String str = "Fri Mar 1, 2013 4:30 PM";          
SimpleDateFormat sdf1 = new SimpleDateFormat("EEE MMM dd, yyyy hh:mm a");
Date date = sdf1.parse(str);
System.out.println("Date Object:" + date);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm a");
System.out.println("Formatted Date:" + sdf2.format(date));

Edit:

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

Для этого вы можете использовать такой код:

//1 minute = 60 seconds
//1 hour = 60 x 60 = 3600
//1 day = 3600 x 24 = 86400
public void printDifference(Date startDate, Date endDate) { 
    //milliseconds
    long different = endDate.getTime() - startDate.getTime();

    System.out.println("startDate : " + startDate);
    System.out.println("endDate : "+ endDate);
    System.out.println("different : " + different);

    long secondsInMilli = 1000;
    long minutesInMilli = secondsInMilli * 60;
    long hoursInMilli = minutesInMilli * 60;
    long daysInMilli = hoursInMilli * 24;

    long elapsedDays = different / daysInMilli;
    different = different % daysInMilli;

    long elapsedHours = different / hoursInMilli;
    different = different % hoursInMilli;

    long elapsedMinutes = different / minutesInMilli;
    different = different % minutesInMilli;

    long elapsedSeconds = different / secondsInMilli;

    System.out.printf(
        "%d days, %d hours, %d minutes, %d seconds%n", 
        elapsedDays, elapsedHours, elapsedMinutes, elapsedSeconds);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...