ミリ秒から同じ時間を表す(時間、分、秒、ミリ秒)のタプルに移動する必要があります。例えば。:
10799999ms = 2h 59m 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)
よりスマート/エレガント/高速/コンパクトにすることが可能であるに違いない。
Javaで行う方法は次のとおりです。
int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours = (int) ((milliseconds / (1000*60*60)) % 24);
良い質問。はい、これをより効率的に行うことができます。 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()
を呼び出すこともできます。
たぶんより短く、よりエレガントになります。しかし、私はそれをやった。
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;
}
本当にエレガントではありませんが、少し短くなります
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)
Valentinosの回答に基づく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);
}
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
}
}
私の短い方法があなたに役立つことを願っています
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 = 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
これはグルーヴィーですが、これはあなたにとって問題ではないということです。メソッドは完璧に動作します。
他のJava例:
long dayLength = 1000 * 60 * 60 * 24;
long dayMs = System.currentTimeMillis() % dayLength;
double percentOfDay = (double) dayMs / dayLength;
int hour = (int) (percentOfDay * 24);
int minute = (int) (percentOfDay * 24 * 60) % 60;
int second = (int) (percentOfDay * 24 * 60 * 60) % 60;
利点は、dayLength
を調整すると、短い日をシミュレートできることです