Преобразование 24 формата в 12 с помощью updateDisplay () - PullRequest
0 голосов
/ 05 декабря 2018

Меня попросили использовать метод updateDisplay () только для изменения формата часа в этом clockDisplay, eveythings работает отлично, час может добраться до 12:59 PM, а использовать метод timeTick () - до 13:00, нопосле повторного использования timeTick () он снова переходит к 1:01.Как я могу решить эту проблему?

public class ClockDisplay
{
    private NumberDisplay hours;
    private NumberDisplay minutes;
    private String displayString;   

    public ClockDisplay()
    {
        hours = new NumberDisplay(24);
        minutes = new NumberDisplay(60);
        updateDisplay();
    }

    public ClockDisplay(int hour, int minute)
    {
        hours = new NumberDisplay(24);
        minutes = new NumberDisplay(60);
        setTime(hour, minute);
    }

    public void timeTick()
    {
        minutes.increment();
        if(minutes.getValue() == 0) {  // it just rolled over!
            hours.increment();
        }
        updateDisplay();
    }

    public void setTime(int hour, int minute)
    {
        hours.setValue(hour);
        minutes.setValue(minute);
        updateDisplay();
    }

    public String getTime()
    {
        return displayString;
    }    

    private void updateDisplay()
    {
        int h = hours.getValue()%12;
        String format = (hours.getValue()/12 == 0 ? "AM":"PM");
        if(h == 0)
        {
            h = 12;
        }
        else if(hours.getValue() > 12)
        {
            hours.setValue(hours.getValue() - 12);
        }
        displayString = hours.getDisplayValue() + ":" + 
        minutes.getDisplayValue() + format;
    }
}

1 Ответ

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

Что не так? Когда время достигает 13:00, ваш метод updateDisplay устанавливает значение отображения часов обратно в 1. Теперь ваш экранный объект часов возвращается в состояние, в котором он находился в 1:00.то есть у вас нет возможности различить эти два раза.

Как исправить? Я предлагаю вам ввести переменную экземпляра (поле) для хранения информации о том, находимся ли мы в AMили PM период дня.Вы можете использовать логическую переменную или ввести enum с двумя константами, такими как AM и PM.Затем вам нужно установить эту переменную в методе timeTick, а также в вашем методе setTime.Тогда будет довольно просто использовать эту переменную, чтобы решить, отображать ли строку AM или PM в вашем методе updateDisplay.

Если вас попросят сделать это без добавленияновое поле : тогда вам нужно, чтобы часы на дисплее hours установились на 23, чтобы вы отслеживали время суток в AM или PM.Поэтому в updateDisplay не устанавливайте значение часов.Только в сгенерированной отображаемой строке вместо 12 и от 0 до 1 вместо 11 - 23 укажите 12 *.

Для производственного кода: В реальной жизни никто не использовал бы дизайн, подобный вашему, исильно зависит от стандартных библиотечных классов для обработки времени.Можно было бы получить более четкое разделение между моделью (текущее время) и представлением (напечатанная строка).Таким образом, текущее время будет храниться в виде LocalTime:

    private LocalTime time;

Отметьте время на 1 минуту вперед:

        time = time.plusMinutes(1);

Для отображения времени вы должны использовать DateTimeFormatter:

    private static final DateTimeFormatter TIME_FORMATTER
            = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);

При этом строка отображения создается следующим образом:

        displayString = time.format(TIME_FORMATTER);

Код не проверяется, поэтому простите, если есть опечатка.

...