Проблема с Calendar.get (Calendar.HOUR) - PullRequest
6 голосов
/ 08 августа 2011

Я пытаюсь отобразить в TextView, когда мое приложение обновлялось в последний раз (например, «Последнее обновление в 12:13). Я пытаюсь использовать экземпляр календаря, и мне показалось, что я правильно понял, но у меня возникли проблемы Я знаю, чтобы получить экземпляр, я использую метод Calendar.getInstance (). И затем, чтобы получить часы и минуты, которые я использовал Calendar.get (Calendar.HOUR) и Calendar.get (Calendar.MINUTE). Мое поле минут возвращает правильно, но Calendar.HOUR возвращает часы на 24-часовых часах, и я хочу 12-часовые часы. Я думал, что HOUR_OF_DAY был 24-часовыми часами. Где я иду не так?

Вот код, который я использую:

Calendar rightNow = Calendar.getInstance();
mTv.setText("Refreshed! Last updated " + 
           rightNow.get(Calendar.HOUR) + ":" + 
           rightNow.get(Calendar.MINUTE) + ".");

mTv - это мой TextView, который я обновляю. Спасибо за любую помощь.

Кроме того, было бы идеально, если бы я мог сказать «Последнее обновление 5 минут назад». вместо «Последнее обновление в 12:13». Но я не уверен, что лучший способ получить это обновление каждую минуту, не истощая ресурсы или батарею ...?

Ответы [ 4 ]

8 голосов
/ 08 августа 2011

Я бы рекомендовал использовать SimpleDateFormat в сочетании с классом Date для форматирования времени:

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("K:mm a");
String formattedTime = sdf.format(now);

Краткое объяснение, как это работает: Вы создаете объект SimpleDateFormat и передаете String его создателю, который сообщает ему, как форматировать каждый объект время / дата, который передается в функцию format (). Существует множество констант / букв, которые представляют особый объект времени (например, секунды, маркер AM / PM, см. Полный список * в документации класса ).

«K: mm a» означает формат «11:42 AM» - одну или две цифры для часа (в зависимости от его значения) в 12-часовом формате, всегда две цифры для минут (мм) и либо AM, либо PM (a), в зависимости от времени.

После того, как вы это сделали, просто передайте объект Date в функцию format (), и вы получите отформатированную строку. Обратите внимание, что Date содержит только один момент времени, если вы создаете его из конструктора без аргументов ("= new Date ()"), он использует текущее время. Если вам нужно другое время, вы можете передать длинный аргумент с помощью millis, вы можете получить его из Calendar.getTimeInMillis ().

Что касается реализации «обновленной функции XY минут назад» - да, вам придется обновлять ее каждую минуту, и вам нужно вычислить разницу между обновлением и текущим временем. Я бы сказал, что это не стоит с точки зрения батареи и дополнительной работы. Если ваше приложение использует стандартные короткие циклы обновления (например, каждый час или что-то в том же духе) и не является полноэкранным, у пользователя есть видимые часы сверху / снизу его экрана. Если он действительно хочет проверить, сколько времени прошло с момента обновления, он может немного взглянуть и сравнить (в основном, минуты или часы / минуты). И IMHO, это не неудобство для пользователя, по крайней мере, не для меня. Я бы просто сравнил, не думая об этом. Но я склонен убивать приложения, которые бесполезно расходуют заряд батареи.

Также обратите внимание, что не все используют 12-часовой формат. Чтобы получить локализованный формат времени в зависимости от настроек пользователя / страны, используйте DateFormat.getTimeInstance (). Это возвращает DateFormat, но это работает как SimpleDateFormat, просто передайте время format ().

4 голосов
/ 02 марта 2016

Использовать Calendar.HOUR_OF_DAY для 24-часовых часов

Calendar rightNow = Calendar.getInstance();
mTv.setText("Refreshed! Last updated " + 
rightNow.get(Calendar.HOUR_OF_DAY) + ":" + 
rightNow.get(Calendar.MINUTE) + ".");
1 голос
/ 08 августа 2011

Вы можете обновлять editText в каждую минуту, используя поток, подобный следующему

Thread t = new Thread(){
public void run() {     
    Calendar oldTime = Calendar.getInstance();
    oldMinute =  oldTime .get(Calendar.MINUTE);
    while(true) {
            Calendar rightNow= Calendar.getInstance();          
        newMinute = rightNow.get(Calendar.MINUTE);
        if(newMinute != oldMinute) {

            oldMinute = newMinute;

            mTv.setText("Refreshed! Last updated " + 
                       rightNow.get(Calendar.HOUR) + ":" + 
                       rightNow.get(Calendar.MINUTE) + ".");
        }
    }
}
t.start();
0 голосов
/ 08 августа 2011

Хорошо, Calendar.get (Calendar.HOUR) должен возвращать 12-часовое время, но если вы хотите получить немного более приятный текст, вы можете использовать класс TimeUnit для простоты синтаксического анализа.

long millis = Calendar.getInstance().getTimeInMillis();
String.format("Last updated %d min, %d sec ago.", 
    TimeUnit.MILLISECONDS.toMinutes(millis),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);
...