2012-06-03 21 views
31

ミリ秒から同じ時間を表すタプル(時間、分、秒、ミリ秒)に移動する必要があります。例:ミリ秒から時、分、秒、およびミリ秒まで

10799999ms = 2時間59メートル59S 999ms

次の擬似コードは、私が思い付くことができる唯一のものです:

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

私は賢くそれを行うことが可能でなければならないと確信しています/よりエレガントな/より速い/よりコンパクトな。ここで

+0

あなたはCや友人でモジュロ演算子(%を使用することができますx = x%(60 * 60 * 1000))の計算を少し簡略化する – fvu

+0

あなたが使用する言語の標準ライブラリにこのような機能がないことを確認してください。 –

答えて

83

は、私はJavaでそれを行うだろうかです:

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

JavaでTimeUnitを使用してコードを読みやすくする価値があります。 –

+8

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

6

良い質問。はい、これをより効率的に行うことができます。 CPUは、1回の操作で2つの整数の比の商と剰余の両方を抽出することができます。 <stdlib.h>では、このCPU操作を公開する関数はdiv()となります。

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 

少ない効率的な答えは別途/%演算子を使用します。あなたの擬似コードでは、あなたはこのような何か、それを使うだろう。しかし、商と剰余の両方が必要な場合は、div()をより効率的に呼び出すこともできます。

4
ない本当にeleganter

が、少し短いが

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

はたぶんもっとエレガント短くすることができるだろう。しかし、私はそれをやった。

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 

これは、これはあなたのための問題ではないことをグルーヴィー、私の事です。方法の完璧な作業。

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

は、私は私の短い方法がValentinosの回答に基づいて、あなたに

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++)のバージョンを助けることを願っています

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