48

ミリ秒から、同じ時間を表す(時間、分、秒、ミリ秒)のタプルに変更する必要があります。例えば:

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)

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

4

10 に答える 10

140

これが私がJavaでそれを行う方法です:

int seconds = (int) (milliseconds / 1000) % 60 ;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours   = (int) ((milliseconds / (1000*60*60)) % 24);
于 2012-06-03T21:38:44.833 に答える
7

良い質問。はい、これをより効率的に行うことができます。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()

于 2012-06-03T21:39:50.897 に答える
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;
}
于 2015-07-23T14:59:24.943 に答える
3

それほどエレガントではありませんが、少し短くなります

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)
于 2012-06-03T21:43:10.723 に答える
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

これはグルーヴィーですが、これはあなたにとって問題ではないと思います。メソッドは完璧に機能します。

于 2016-12-04T14:11:43.200 に答える
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
  }
}

私の短い方法があなたに役立つことを願っています

于 2016-12-04T14:26:42.453 に答える
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);
    }
}
于 2017-09-28T14:15:40.697 に答える
0

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); 
}
于 2018-03-05T19:47:20.073 に答える
0

他の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

于 2019-03-13T21:38:38.983 に答える
0

時間/分/秒の先行ゼロが10より小さいKotlinの例。したがって、たとえばUIで値を文字列として使用する場合、長さは同じ期間になります。

これにより、hh:mn:ssアノテーションを混乱させる可能性のある1:57:1ではなく01:57:01が得られます。

val timeInMilliSec = 45600030

val hours = timeInMilliSec.div(3600).rem(24)
val minutes = timeInMilliSec.div(60).rem(60)
val seconds = timeInMilliSec.rem(60)

val hoursFormatted = if (hours < 10) "0$hours" else "$hours"
val minutesFormatted = if (minutes < 10) "0$minutes" else "$minutes"
val secondsFormatted = if (seconds < 10) "0$seconds" else "$seconds"

"$hoursFormatted:$minutesFormatted:$secondsFormatted"

                        
于 2021-08-02T12:17:28.483 に答える