sumar segundos minutos milisegundos horas hora formato convertir convertidor conversión con algorithm date pseudocode

algorithm - minutos - sumar milisegundos



Desde milisegundos hasta hora, minutos, segundos y milisegundos (8)

Necesito pasar de milisegundos a una tupla de (hora, minutos, segundos, milisegundos) que representa la misma cantidad de tiempo. P.ej:

10799999ms = 2h 59m 59s 999ms

El siguiente pseudo-código es lo único que se me ocurre:

# The division operator below returns the result as a rounded down integer function to_tuple(x): h = x / (60*60*1000) x = x - h*(60*60*1000) m = x / (60*1000) x = x - m*(60*1000) s = x / 1000 x = x - s*1000 return (h,m,s,x)

Estoy seguro de que debe ser posible hacerlo de manera más inteligente / más elegante / más rápida / más compacta.


Así es como lo haría en Java:

int seconds = (int) (milliseconds / 1000) % 60 ; int minutes = (int) ((milliseconds / (1000*60)) % 60); int hours = (int) ((milliseconds / (1000*60*60)) % 24);


Buena pregunta. Sí, uno puede hacer esto de manera más eficiente. Su CPU puede extraer tanto el cociente como el resto de la relación de dos enteros en una sola operación. En <stdlib.h> , la función que expone esta operación de la CPU se llama div() . En su psuedocode, lo usaría algo como esto:

function to_tuple(x): qr = div(x, 1000) ms = qr.rem qr = div(qr.quot, 60) s = qr.rem qr = div(qr.quot, 60) m = qr.rem h = qr.quot

Una respuesta menos eficiente usaría los operadores / y % separado. Sin embargo, si necesita el cociente y el resto, de todos modos, entonces también puede llamar al div() más eficiente div() .


Tal vez puede ser más corto y más elegante. Pero lo hice.

public String getHumanTimeFormatFromMilliseconds(String millisecondS){ String message = ""; long milliseconds = Long.valueOf(millisecondS); if (milliseconds >= 1000){ int seconds = (int) (milliseconds / 1000) % 60; int minutes = (int) ((milliseconds / (1000 * 60)) % 60); int hours = (int) ((milliseconds / (1000 * 60 * 60)) % 24); int days = (int) (milliseconds / (1000 * 60 * 60 * 24)); if((days == 0) && (hours != 0)){ message = String.format("%d hours %d minutes %d seconds ago", hours, minutes, seconds); }else if((hours == 0) && (minutes != 0)){ message = String.format("%d minutes %d seconds ago", minutes, seconds); }else if((days == 0) && (hours == 0) && (minutes == 0)){ message = String.format("%d seconds ago", seconds); }else{ message = String.format("%d days %d hours %d minutes %d seconds ago", days, hours, minutes, seconds); } } else{ message = "Less than a second ago."; } return message; }


Versión de Arduino (c ++) basada en la respuesta de Valentinos

unsigned long timeNow = 0; unsigned long mSecInHour = 3600000; unsigned long TimeNow =0; int millisecs =0; int seconds = 0; byte minutes = 0; byte hours = 0; void setup() { Serial.begin(9600); Serial.println (""); // because arduino monitor gets confused with line 1 Serial.println ("hours:minutes:seconds.milliseconds:"); } void loop() { TimeNow = millis(); hours = TimeNow/mSecInHour; minutes = (TimeNow-(hours*mSecInHour))/(mSecInHour/60); seconds = (TimeNow-(hours*mSecInHour)-(minutes*(mSecInHour/60)))/1000; millisecs = TimeNow-(hours*mSecInHour)-(minutes*(mSecInHour/60))- (seconds*1000); Serial.print(hours); Serial.print(":"); Serial.print(minutes); Serial.print(":"); Serial.print(seconds); Serial.print("."); Serial.println(millisecs); }


no es realmente elegante, pero un poco más corto sería

function to_tuple(x): y = 60*60*1000 h = x/y m = (x-(h*y))/(y/60) s = (x-(h*y)-(m*(y/60)))/1000 mi = x-(h*y)-(m*(y/60))-(s*1000) return (h,m,s,mi)


import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; public class MyTest { public static void main(String[] args) { long seconds = 360000; long days = TimeUnit.SECONDS.toDays(seconds); long hours = TimeUnit.SECONDS.toHours(seconds - TimeUnit.DAYS.toSeconds(days)); System.out.println("days: " + days); System.out.println("hours: " + hours); } }


milliseconds = 12884983 // or x milliseconds hr = 0 min = 0 sec = 0 day = 0 while (milliseconds >= 1000) { milliseconds = (milliseconds - 1000) sec = sec + 1 if (sec >= 60) min = min + 1 if (sec == 60) sec = 0 if (min >= 60) hr = hr + 1 if (min == 60) min = 0 if (hr >= 24) { hr = (hr - 24) day = day + 1 } }

Espero que mi método más corto te ayude


milliseconds = x total = 0 while (milliseconds >= 1000) { milliseconds = (milliseconds - 1000) total = total + 1 } hr = 0 min = 0 while (total >= 60) { total = total - 60 min = min + 1 if (min >= 60) hr = hr + 1 if (min == 60) min = 0 } sec = total

Esto es genial, pero creo que esto no es problema para ti. El método funciona perfecto.