Problema con Calendar.get (Calendar.HOUR)

Estoy tratando de mostrar en un TextView cuando mi aplicación se actualizó por última vez (por ejemplo, "Última actualización a las 12:13.) Estoy tratando de utilizar una instancia de calendario y pensé que lo entendía correctamente, pero parece que tienen problemas. Para obtener una instancia que utilizo el método Calendar.getInstance () .Entonces para obtener la hora y minuto que estaba usando Calendar.get (Calendar.HOUR) y Calendar.get (Calendar.MINUTE). Mi campo de minutos devuelve correctamente, pero Calendario .HOUR es devolver la hora en un reloj de 24 horas y quiero un reloj de 12 horas.Pensé que HOUR_OF_DAY era el reloj de 24 horas.¿Dónde voy mal?

Aquí está el código que estoy usando:

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

MTv es mi TextView que estoy actualizando. Gracias por cualquier ayuda.

Además, sería ideal si pudiera decir "Última actualización hace 5 minutos." En lugar de "Última actualización a las 12:13 pm". Pero no estoy seguro de la mejor manera de tener esta actualización cada minuto sin drenaje de recursos o la batería …?

Yo recomendaría usar SimpleDateFormat en combinación con la clase Date para formatear la hora:

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

Breve explicación de cómo funciona: Crea un objeto SimpleDateFormat y pasa una String a su construtor que le dice cómo dar formato a cada objeto de tiempo / fecha que se pasa a la función format () de la misma. Hay un montón de constantes / letras que representan un objeto de tiempo especial (por ejemplo, segundos, un marcador AM / PM, .. ver la documentación de la clase para la lista completa).

"K: mm a" significa un formato "11:42 AM" – uno o dos dígitos para la hora (dependiendo de su valor) en un formato de 12 horas, siempre dos dígitos para los minutos (mm) y AM o PM ), Dependiendo del tiempo.

Después de hacer eso, simplemente pase un objeto Date a la función format () y obtendrá una cadena formateada. Tenga en cuenta que una fecha sólo tiene un único punto en el tiempo, si lo crea desde el constructor sin argumentos ("= new Date ()") utiliza la hora actual. Si necesita otro tiempo, puede pasar un argumento largo con el millis, puede obtener que de Calendar.getTimeInMillis ().

A partir de la implementación de la función "Actualizado XY minutos atrás" – sí tendría que actualizar cada minuto y usted tiene que calcular la diferencia entre la actualización y la hora actual. Yo diría que no vale la pena de una batería y la perspectiva de trabajo adicional. Si su aplicación utiliza ciclos de actualización cortos estándar (por ejemplo, cada hora o algo a lo largo de esas líneas) y no es pantalla completa, el usuario tiene un reloj visible en la parte superior / inferior de su pantalla. Si realmente quiere comprobar cuánto tiempo pasó desde la actualización, puede echar un vistazo corto y comparar (en su mayoría sólo minutos o horas / minutos). Y IMHO thats no inconvinience para un usuario, por lo menos no sería para mí. Me gustaría comparar sin pensar en eso. Pero tienden a matar aplicaciones que pierden mi batería sin razón útil.

También tenga en cuenta que no todo el mundo utiliza un formato de 12 horas. Para obtener un formato de hora localizada dependiendo de la configuración de los usuarios / uso del país DateFormat.getTimeInstance (). Esto devuelve un DateFormat, pero esto funciona como el SimpleDateFormat, simplemente pasar un tiempo para format ().

Utilice Calendar.HOUR_OF_DAY para el reloj de 24 horas

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

Puede actualizar editText en cada minuto usando un hilo como el siguiente

 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(); 

Bueno, Calendar.get (Calendar.HOUR) debería estar devolviendo 12 horas, pero si desea producir un texto ligeramente mejor, puede utilizar la clase TimeUnit para analizar la simplicidad.

 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)) ); 
  • Cómo iniciar la aplicación de calendario de Android con Intent (Froyo)
  • ¿Dónde puedo obtener el código fuente de Android 1.5 y 1.6?
  • Webcal / .ics se suscriben al feed de la aplicación de Android
  • Calendario y PagerAdapter - Vistas ilimitadas
  • En Java, cómo obtener cadenas de días de la semana (Sun, Mon, ..., Sat) con el sistema de configuración por defecto (idioma)
  • Android - ¿Cómo se especifica una ubicación al llamar al calendario con una intención?
  • Calendario de Android Java getDisplayName / s devolver null
  • Android - Nuevo estilo de calendario DatePicker y TimePicker
  • Intención que abre la actividad de "evento de calendario nuevo"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.