Convertir valor segundos a horas minutos segundos?

He estado tratando de convertir un valor de segundos (en una variable BigDecimal) a una cadena en un editText como "1 hora 22 minutos 33 segundos" o algo por el estilo.

He intentado esto:

String sequenceCaptureTime = ""; BigDecimal roundThreeCalc = new BigDecimal("0"); BigDecimal hours = new BigDecimal("0"); BigDecimal myremainder = new BigDecimal("0"); BigDecimal minutes = new BigDecimal("0"); BigDecimal seconds = new BigDecimal("0"); BigDecimal var3600 = new BigDecimal("3600"); BigDecimal var60 = new BigDecimal("60"); 

(Tengo un roundThreeCalc que es el valor en segundos así que trato de convertirlo aquí.)

 hours = (roundThreeCalc.divide(var3600)); myremainder = (roundThreeCalc.remainder(var3600)); minutes = (myremainder.divide(var60)); seconds = (myremainder.remainder(var60)); sequenceCaptureTime = hours.toString() + minutes.toString() + seconds.toString(); 

A continuación, establezco editText a sequnceCaptureTime String. Pero eso no funcionó. Fuerza cerró la aplicación cada vez. Estoy totalmente fuera de mi profundidad aquí, cualquier ayuda es muy apreciada. Codificación feliz!

Debería tener más suerte con

 hours = roundThreeCalc.divide(var3600, BigDecimal.ROUND_FLOOR); myremainder = roundThreeCalc.remainder(var3600); minutes = myremainder.divide(var60, BigDecimal.ROUND_FLOOR); seconds = myremainder.remainder(var60); 

Esto reducirá los valores decimales después de cada división.

Editar: Si eso no funcionó, intente esto. (Acabo de escribir y probarlo)

 public static int[] splitToComponentTimes(BigDecimal biggy) { long longVal = biggy.longValue(); int hours = (int) longVal / 3600; int remainder = (int) longVal - hours * 3600; int mins = remainder / 60; remainder = remainder - mins * 60; int secs = remainder; int[] ints = {hours , mins , secs}; return ints; } 

¿Es necesario usar un BigDecimal? Si no tienes que hacerlo, usaría un int o largo durante segundos, y simplificaría un poco las cosas:

 hours = totalSecs / 3600; minutes = (totalSecs % 3600) / 60; seconds = totalSecs % 60; timeString = String.format("%02d:%02d:%02d", hours, minutes, seconds); 

Es posible que desee pad cada uno para asegurarse de que son valores de dos dígitos (o lo que sea) en la cadena, sin embargo.

DateUtils.formatElapsedTime(long) , formatea un tiempo transcurrido en la forma " MM:SS " o " H:MM:SS ". Devuelve la cadena que está buscando. Puede encontrar la documentación aquí

Aquí está el código de trabajo:

 private String getDurationString(int seconds) { int hours = seconds / 3600; int minutes = (seconds % 3600) / 60; seconds = seconds % 60; return twoDigitString(hours) + " : " + twoDigitString(minutes) + " : " + twoDigitString(seconds); } private String twoDigitString(int number) { if (number == 0) { return "00"; } if (number / 10 == 0) { return "0" + number; } return String.valueOf(number); } 

Algo realmente útil en Java 8

 import java.time.LocalTime; private String ConvertSecondToHHMMSSString(int nSecondTime) { return LocalTime.MIN.plusSeconds(nSecondTime).toString(); } 
 private String ConvertSecondToHHMMString(int secondtTime) { TimeZone tz = TimeZone.getTimeZone("UTC"); SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); df.setTimeZone(tz); String time = df.format(new Date(secondtTime*1000L)); return time; } 

Prefiero java construido en la biblioteca TimeUnit

 long seconds = TimeUnit.MINUTES.toSeconds(8); 

Aquí está mi función para resolver el problema:

 public static String getConvertedTime(double time){ double h,m,s,mil; mil = time % 1000; s = time/1000; m = s/60; h = m/60; s = s % 60; m = m % 60; h = h % 24; return ((int)h < 10 ? "0"+String.valueOf((int)h) : String.valueOf((int)h))+":"+((int)m < 10 ? "0"+String.valueOf((int)m) : String.valueOf((int)m)) +":"+((int)s < 10 ? "0"+String.valueOf((int)s) : String.valueOf((int)s)) +":"+((int)mil > 100 ? String.valueOf((int)mil) : (int)mil > 9 ? "0"+String.valueOf((int)mil) : "00"+String.valueOf((int)mil)); } 

Yo uso esto:

  public String SEG2HOR( long lnValue) { //OK String lcStr = "00:00:00"; String lcSign = (lnValue>=0 ? " " : "-"); lnValue = lnValue * (lnValue>=0 ? 1 : -1); if (lnValue>0) { long lnHor = (lnValue/3600); long lnHor1 = (lnValue % 3600); long lnMin = (lnHor1/60); long lnSec = (lnHor1 % 60); lcStr = lcSign + ( lnHor < 10 ? "0": "") + String.valueOf(lnHor) +":"+ ( lnMin < 10 ? "0": "") + String.valueOf(lnMin) +":"+ ( lnSec < 10 ? "0": "") + String.valueOf(lnSec) ; } return lcStr; } 

Saber esto es bastante antiguo, pero en java 8:

LocalTime.MIN.plusSeconds (120) .format (DateTimeFormatter.ISO_LOCAL_TIME)

Esta es mi solución simple:

 String secToTime(int sec) { int seconds = sec % 60; int minutes = sec / 60; if (minutes >= 60) { int hours = minutes / 60; minutes %= 60; if( hours >= 24) { int days = hours / 24; return String.format("%d days %02d:%02d:%02d.", days,hours%24, minutes, seconds); } return String.format("%02d:%02d:%02d", hours, minutes, seconds); } return String.format("00:%02d:%02d", minutes, seconds); } 

Results prueba:

 Result: 00:00:36. - 36 Result: 01:00:07. - 3607 Result: 6313 days 12:39:05. - 545488745 

Si desea que las unidades h , min y sec durante un período de tiempo se puede utilizar esto:

 String convertSeconds(int seconds) int h = seconds/ 3600; int m = (seconds % 3600) / 60; int s = seconds % 60; String sh = (h > 0 ? String.valueOf(h) + " " + "h" : ""); String sm = (m < 10 && m > 0 && h > 0 ? "0" : "") + (m > 0 ? (h > 0 && s == 0 ? String.valueOf(m) : String.valueOf(m) + " " + "min") : ""); String ss = (s == 0 && (h > 0 || m > 0) ? "" : (s < 10 && (h > 0 || m > 0) ? "0" : "") + String.valueOf(s) + " " + "sec"); return sh + (h > 0 ? " " : "") + sm + (m > 0 ? " " : "") + ss; } int seconds = 3661; String duration = convertSeconds(seconds); 

Eso es un montón de operadores condicionales. El método devolverá esas cadenas:

 0 -> 0 sec 5 -> 5 sec 60 -> 1 min 65 -> 1 min 05 sec 3600 -> 1 h 3601 -> 1 h 01 sec 3660 -> 1 h 01 3661 -> 1 h 01 min 01 sec 108000 -> 30 h 

Yo uso esto en python para convertir un flotador que representa segundos a horas, minutos, segundos y microsegundos. Es razonablemente elegante y es útil para convertir a un tipo de fecha y hora a través de strptime para convertir. También podría extenderse fácilmente a intervalos más largos (semanas, meses, etc.) si es necesario.

  def sectohmsus(seconds): x = seconds hmsus = [] for i in [3600, 60, 1]: # seconds in a hour, minute, and second hmsus.append(int(x / i)) x %= i hmsus.append(int(round(x * 1000000))) # microseconds return hmsus # hours, minutes, seconds, microsecond 
  • Depurar los intentos
  • TabHost muestra contenido una vez (onCreate)
  • Eliminar ListView pie de página Click Listener
  • ¿Cómo uncheck artículos en AlertDialog (setMultiChoiceItems)?
  • Selección / resaltado de varios elementos en listview con adaptador personalizado - Android
  • No se puede limpiar el proyecto en Android Studio
  • Creación de un adaptador a un CustomView
  • Vista previa de diseño de Android arroja error al agregar LinearLayout personalizado
  • La actividad se vuelve a cargar cuando cambia la orientación en Android
  • ¿Está bien crear varios threadspoints (ExecutorService)?
  • ¿Podemos usar CSS en formularios Android para los componentes de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.