Преобразование 24-часовых часов в 12-часовые Java

Итак, у меня есть класс часов, который изначально настроен как 24-часовой формат, но мне нужно, чтобы часы отображались как 12-часовые часы, используя только этот метод! Я пытался в течение нескольких часов, но потерпел неудачу! Пожалуйста помоги. Заставьте часы отображать время в 12-часовом формате (чч:мм:сс AM/PM). Используйте абстракцию — ничего не меняйте, кроме метода updateDisplay(). Часы могут использовать военное время «под одеялом»; ему просто нужно вернуть правильную строку при вызове getTime().

private void updateDisplay()
{
    String AM = "AM";
    String PM = "PM";

    if(hours.getValue() == 0) {
        hours.setValue(hours.getValue() + 12);
        PM = "";
    }
    else if(hours.getValue() == 1 < hours.getValue() && hours.getValue() < 11) {
        PM = "";
    }
    else if(hours.getValue() == 12) {
       AM = "";
    }
    else if(hours.getValue() == 13 > 24) {
        hours.setValue(hours.getValue() - 12);
       AM = "";
    }

    displayString = hours.getDisplayValue() + ":" + 
    minutes.getDisplayValue() + ":" +
    seconds.getDisplayValue() + PM + AM;
}

person DrJonesYu    schedule 28.01.2013    source источник


Ответы (3)


24-часовые часы, H, отсчитываются от 0‹=H‹=23. Если H div 12 равно 0, то AM, иначе PM. Тогда 12-часовые часы, ч, равны H mod 12, если это значение не равно 0, и в этом случае h = 12. Вы не должны изменять значение (hours.setValue(...)) в своем коде отображения, и вам не нужно преобразовывать его в секунды. Я думаю, что проблема с вашим кодом - это просто проблема синтаксиса в первом условном выражении.

... if(hours.getValue() == 1 < hours.getValue() ... // This is wrong

Вы сравниваете значение часов с 1, а затем результат сравнения с часами. Это не будет компилироваться в java, потому что логические значения несравнимы с целыми числами.

Примечание. Когда я говорю div, я имею в виду целочисленное деление (то есть усеченный оператор / в Java), а когда я говорю mod, я имею в виду целочисленный модуль (оператор % в Java).

Обновление. Все, что вам нужно сделать, это преобразовать 24-часовое значение hours.getValue() в 12-часовой эквивалент для отображения. Что-то вроде:

// Not correct Java!
string meridianNess = (hours.getValue()/12==0?"AM":"PM");
int h = hours.getValue()%12;
if (h==0) h = 12;
System.out.print(h+":"+new NumberFormat("00").format(minutes.getValue())+":"+
    new NumberFormat("00").format(seconds.getValue())+" "+meridianNess);
person Tim    schedule 28.01.2013
comment
Итак.... все, что мне нужно сделать, это код A 24-часовой формат, H, начинается с 0‹=H‹=23. Если H div 12 равен 0, то AM, иначе PM. Тогда 12-часовые часы, h, представляют собой H по модулю 12, если только это значение не равно 0, и в этом случае h = 12. И это превратит мои 24-часовые часы в 12-часовые? - person DrJonesYu; 28.01.2013
comment
Спасибо, я заставил его работать, и я понимаю большую часть этого, но не могли бы вы объяснить, что делает (hours.getValue()/12==0?AM:PM)? Благодарю вас! - person DrJonesYu; 28.01.2013
comment
Он называется тернарным оператором и представляет собой просто сокращенный оператор if/else. Вы можете прочитать, что ЕСЛИ часы получают значение, деленное на 12, РАВНО 0, ТОГДА возвращают am, ELSE возвращают PM. Тот, который будет возвращен, будет назначен меридиану. Кроме того, я рад, что это сработало для вас, не могли бы вы принять мой ответ? Спасибо. - person Tim; 28.01.2013

Хорошая краткая формула для этого, которая хорошо работает, состоит в том, чтобы добавить 11, затем взять «по модулю 12», а затем добавить еще один:

hours.setValue(((hours.getValue()+11)%12)+1);

i.e.

h_12 = ( (h_24+11) % 12 ) + 1

Это дает желаемый результат для любого значения, включая часы = 0, часы = 12 и т. д.

(И затем, конечно, используйте любое из решений, упомянутых ранее для отображения AM/PM)

person BobH    schedule 11.03.2015

Попробуйте преобразовать 24-часовое время в секунды, тогда это должно быть легко...

person Rui Brito    schedule 28.01.2013