2012-06-03 7 views
31

Ich muss von Millisekunden zu einem Tupel von (Stunden, Minuten, Sekunden, Millisekunden) gehen, die die gleiche Zeitmenge darstellen. ZB:Von Millisekunden zu Stunde, Minuten, Sekunden und Millisekunden

10799999ms = 2h 59m 59s 999ms

Der folgende Pseudo-Code ist das einzige, was ich tun konnte:

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

Ich bin sicher, dass es möglich sein muss, es zu tun smarter/eleganter/schneller/kompakter.

+0

man konnte den Modulo-Operator (% in C verwenden und Freunde) um die Berechnungen von x etwas zu vereinfachen (zB x = x% (60 * 60 * 1000)) – fvu

+0

Stellen Sie sicher, dass Sie diese Funktionalität nicht bereits in der von Ihnen verwendeten Standardbibliothek der Sprache haben. –

Antwort

83

Hier ist, wie ich es in Java tun würde:

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

lohnt es sich, TimeUnit in Java zu verwenden, um Code lesbarer zu machen. –

+8

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

6

Gute Frage. Ja, das kann man effizienter machen. Ihre CPU kann sowohl den Quotienten als auch den Rest des Verhältnisses zweier Ganzzahlen in einem einzigen Vorgang extrahieren. In <stdlib.h> heißt die Funktion, die diese CPU-Operation verfügbar macht, div(). In Ihrem psuedocode, würden Sie es so etwas wie folgt verwenden:

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 

Eine weniger effiziente Antwort die / und % Betreiber separat verwenden würden. Wenn Sie jedoch sowohl den Quotienten als auch den Rest benötigen, können Sie auch den effizienteren div() aufrufen.

4

nicht wirklich eleganter, aber ein bisschen kürzer wäre

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

Vielleicht kürzer ein eleganter sein kann. Aber ich habe es getan.

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 

Dieses auf groovy, aber ich Sache, dass dies für Sie nicht Problem. Methode funktioniert perfekt.

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

Ich hoffe, dass meine kürzere Methode Sie

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++) Version basierend auf Valentinos Antwort helfen

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