2012-06-03 19 views
31

Potrzebuję przejść od milisekund do krotki (godziny, minut, sekund, milisekund) reprezentujących ten sam czas. Np:Od milisekund do godziny, minut, sekund i milisekund

10799999ms = 2h 59m 59s 999ms

Następujący pseudo-kod jest jedyną rzeczą, mogę wymyślić:

# 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) 

Jestem pewien, że musi być możliwe, aby to zrobić mądrzejszy/bardziej elegancki/szybszy/bardziej kompaktowy.

+0

można użyć operatora modulo (% w C i przyjaciółmi), aby nieco uprościć obliczenia x (np. x = x% (60 * 60 * 1000)). – fvu

+0

Upewnij się, że nie masz już takiej funkcji w standardowej bibliotece używanego języka. –

Odpowiedz

83

Oto w jaki sposób mogę to zrobić w Javie:

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

Warto używać TimeUnit w języku Java, aby kod był bardziej czytelny. –

+8

'long millis = 12884983; System.out.println ((((millis/(1000 * 60))% 60)); System.out.println (java.util.concurrent.TimeUnit.MILLISECONDS.toMinutes (millis)); 'wyjście: 34 | 214 – JBoy

6

dobre pytanie. Tak, można to zrobić bardziej efektywnie. Twój procesor może wyodrębnić zarówno iloraz, jak i resztę stosunku dwóch liczb całkowitych w jednej operacji. W <stdlib.h> funkcja, która udostępnia tę operację procesora, nazywa się div(). W swojej psuedocode, można go używać coś takiego:

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 

Mniej wydajny odpowiedź użyłby operatorów / i % oddzielnie. Jeśli jednak potrzebujesz zarówno ilorazu, jak i reszty, równie dobrze możesz wywołać bardziej wydajny div().

4
nie

naprawdę Eleganter, ale nieco krócej byłoby

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) 
5

Może być krótszy bardziej elegancki. Ale zrobiłem to.

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; 
} 
0
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 

To jest porywające, ale rzeczą, że nie jest to problem dla ciebie. Metoda działa idealnie.

0
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 
    } 
} 

Mam nadzieję, że moja krótsza metoda pomoże Ci

0
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); 
    } 
} 
0

Arduino (C++) w wersji na podstawie Valentinos odpowiedź

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); 
} 
Powiązane problemy