Java - изменить текущее время и сосчитать - PullRequest
0 голосов
/ 14 ноября 2018

Я новичок в stackoverflow, и он мне очень помог в моем первом семестре Java. Недавно я столкнулся с проблемой, что я не мог найти помощь нигде. Посмотрев практически все потоки stackoverflow и другие сайты, я решил спросить здесь. Буду очень признателен за любую помощь в этом.

В моем домашнем задании говорится, что нам нужно создать цифровые часы, которые будут вводить пользовательские часы, минуты и секунды после вызова функции в Main. Затем следует вывести это время и продолжить увеличивать время. Инструкции дали подсказку, чтобы взять разницу во времени с текущим временем, но я не мог получить правильное время таким образом. Это мой текущий код для функций setTime и displayTime:

    public void setTime(int InsertHours, int InsertMinutes, int InsertSeconds) {
        minutes = InsertMinutes;
        hours = InsertHours;
        seconds = InsertSeconds;
        currentTime.set(Calendar.HOUR, hours);
        currentTime.set(Calendar.MINUTE, minutes);
        currentTime.set(Calendar.SECOND, seconds);
    }

    public void displayTime()
    {
        SimpleDateFormat newTimeFormat = new SimpleDateFormat("hh:mm:ss a");
        timeDiff = Math.abs(currentTime.getTimeInMillis() - System.currentTimeMillis());

        System.out.print("The current time after setTime: " + newTimeFormat.format(timeDiff));
    }
}

Если я вызываю функцию вот так (без часов: текст)

d.setTime(hours: 10, minutes: 25, seconds: 56);

Вывод:

The current time after setTime: 07:42:22 PM

и он будет отсчитывать в обратном направлении. Так что это будет с 7:42:22 до 7:42:19 и так далее. Я хотел бы, чтобы это вывело 10:25:56 и продолжало считать, но я потратил несколько часов на это и не могу понять это. Я заметил, что другие делают это с отдельной функцией timeTick (), но я бы хотел избежать каких-либо дополнительных функций, а не setTime и displayTime. Я очень признателен за любую помощь с этим. Спасибо!

Ответы [ 3 ]

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

java.time

Сначала я бы пропустил Calendar и SimpleDateFormat. Эти классы были плохо разработаны и в настоящее время давно устарели. Вместо этого я бы создал LocalTime объект из часа, минуты и секунды, которые ввел пользователь. LocalTime - это время суток без даты и без часового пояса.

Я бы, вероятно, использовал java.util.Timer для отображения нового значения каждый раз, когда проходит одна секунда. Его метод scheduleAtFixedRate(TimerTask, long, long) выполняет ваш TimerTask один раз в секунду, если вы передаете ему период 1000 (миллисекунд). Если вам нужен более простой подход, ответ Scary Wombat дает ответ, который не требует ни Timer, ни TimerTask.

В вашем TimerTask добавьте 1 секунду к вашему LocalTime, используя его plusSeconds метод, и помните, что этот метод возвращает новый LocalTime объект, который вам нужно использовать. Затем отобразите его, используя DateTimeFormatter. DateTimeFormatter.ofLocalizedTime() даст вам подходящий форматер для вашей локали.

Что пошло не так в вашем коде?

Вы не дали нам полный пример, поэтому трудно быть полностью уверенным, но, похоже, именно это и произошло:

  • Вы создали объект Calendar, представляющий текущую дату и время.
  • Вы устанавливаете его время в AM или PM на время, которое ввел пользователь. Если, например, в 14:43:34 пользователь введет 10:25:56, Calendar будет установлен на 22:25:56 в тот же день.
  • В displayTime() вычисляется разница между текущим временем и объектом Calendar в миллисекундах. Если время Calendar находится в будущем (как в примере), эта разница будет все меньше и меньше, пока не будет достигнуто время Calendar, что объясняет, почему ваши часы отсчитывают время, а не увеличивают.
  • Вы отображаете разницу во времени, используя SimpleDateFormat со своим часовым поясом по умолчанию. Это не верно. Программа форматирования принимает ваше число за миллисекунды с 1 января 1970 года в 00:00 UTC и преобразует это время в ваш часовой пояс. Для простого примера, если разница оказалась равной 1000 миллисекунд (1 секунда), она отобразит 00:00:01 UTC. Если ваш часовой пояс был America / New_York, ваше время будет 19:00:01 накануне вечером, поэтому будет отображаться 07:00:01 PM.

Ссылки

PS: при поиске в Интернете очень легко создать впечатление, что Calendar и SimpleDateFormat - это классы для использования, поскольку многие старые веб-страницы все еще лежат с того времени, когда это имело место. И их даже больше, потому что эти классы были сложны в использовании и поэтому нуждались в объяснении. Эти страницы больше не говорят правду о хороших классах, которые можно использовать для операций с датой и временем. Вместо этого используйте java.time. Всегда.

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

Думаю, я бы использовал тот же подход, что и Scary Wombat, попробуйте следующий код:

    Scanner scanner = new Scanner(System.in);
    //Reading values for hours, minutes and seconds
    System.out.print("Hours: ");
    int h = scanner.nextInt();
    System.out.print("Minutes: ");
    int m = scanner.nextInt();
    System.out.print("Seconds: ");
    int s = scanner.nextInt();
    System.out.println();

    do{ //Creating an infinite loop while program is running
        if (s+1 == 60){ //Controlig the seconds updates
            s=1;
            if (m+1 == 60){//Controling the minites updates
                m=0;
                h+=1; // Here you could control hours updates
            }else{
                m+=1;
            }
        }else{
            s+=1;
        }
        System.out.println(String.valueOf(h)+":" +String.valueOf(m) + ":"+String.valueOf(s));
        Thread.sleep(1000);//Deelaying execution 1 second
    }while(true);

В этом случае вам просто нужно заполнить код для контроля часов обновлений

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

Без всякого причудливого форматирования вашей даты (и убедившись, что это правильная дата), основной поток кода будет выглядеть как

int h = 1, min = 5, sec = 10;
long start = System.currentTimeMillis();
while (true) {  // or whatever
    long now = System.currentTimeMillis();
    long offset = now - start;
    System.out.println(sec + (offset / 1000));
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
         e.printStacktrace();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...