webentwicklung-frage-antwort-db.com.de

Wie konvertiere ich Millisekunden in eine für Menschen lesbare Form?

Ich muss eine beliebige Anzahl von Millisekunden in Tage, Stunden, Minuten und Sekunden umrechnen.

Zum Beispiel: 10 Tage, 5 Stunden, 13 Minuten, 1 Sekunde.

117
FlySwat

Nun, da noch niemand aufgetaucht ist, werde ich den einfachen Code schreiben, um dies zu tun:

x = ms / 1000
seconds = x % 60
x /= 60
minutes = x % 60
x /= 60
hours = x % 24
x /= 24
days = x

Ich bin nur froh, dass du an Tagen aufgehört hast und nicht monatelang danach gefragt hast. :)

Beachten Sie, dass oben angenommen wird, dass / steht für das Abschneiden der Ganzzahldivision. Wenn Sie diesen Code in einer Sprache verwenden, in der / steht für Gleitkommadivision. Sie müssen die Divisionsergebnisse nach Bedarf manuell abschneiden.

222
Greg Hewgill

Sei A die Anzahl der Millisekunden. Dann haben Sie:

seconds=(A/1000)%60
minutes=(A/(1000*60))%60
hours=(A/(1000*60*60))%24

und so weiter (% ist der Moduloperator).

Hoffe das hilft.

56

Die beiden folgenden Lösungen verwenden Javascript (Ich hatte keine Ahnung, dass die Lösung sprachunabhängig ist!). Beide Lösungen müssen erweitert werden, wenn die Erfassungsdauer > 1 month.

Lösung 1: Verwenden Sie das Date-Objekt

var date = new Date(536643021);
var str = '';
str += date.getUTCDate()-1 + " days, ";
str += date.getUTCHours() + " hours, ";
str += date.getUTCMinutes() + " minutes, ";
str += date.getUTCSeconds() + " seconds, ";
str += date.getUTCMilliseconds() + " millis";
console.log(str);

Gibt:

"6 days, 5 hours, 4 minutes, 3 seconds, 21 millis"

Bibliotheken sind hilfreich, aber warum sollten Sie eine Bibliothek verwenden, wenn Sie das Rad neu erfinden können? :)

Lösung 2: Schreiben Sie Ihren eigenen Parser

var getDuration = function(millis){
    var dur = {};
    var units = [
        {label:"millis",    mod:1000},
        {label:"seconds",   mod:60},
        {label:"minutes",   mod:60},
        {label:"hours",     mod:24},
        {label:"days",      mod:31}
    ];
    // calculate the individual unit values...
    units.forEach(function(u){
        millis = (millis - (dur[u.label] = (millis % u.mod))) / u.mod;
    });
    // convert object to a string representation...
    var nonZero = function(u){ return dur[u.label]; };
    dur.toString = function(){
        return units
            .reverse()
            .filter(nonZero)
            .map(function(u){
                return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
            })
            .join(', ');
    };
    return dur;
};

Erstellt ein "Duration" -Objekt mit den von Ihnen gewünschten Feldern. Das Formatieren eines Zeitstempels wird dann einfach ...

console.log(getDuration(536643021).toString());

Gibt:

"6 days, 5 hours, 4 minutes, 3 seconds, 21 millis"
24
Nick Grealy

Apache Commons Lang hat ein DurationFormatUtils , das sehr hilfreiche Methoden wie formatDurationWords enthält.

20
David Dossot

Sie sollten die datetime-Funktionen in jeder Sprache verwenden, die Sie verwenden. Zum Spaß hier der Code:

int milliseconds = someNumber;

int seconds = milliseconds / 1000;

int minutes = seconds / 60;

seconds %= 60;

int hours = minutes / 60;

minutes %= 60;

int days = hours / 24;

hours %= 24;
7
albertein

Dies ist eine Methode, die ich geschrieben habe. Es dauert ein integer milliseconds value und gibt ein human-readable String:

public String convertMS(int ms) {
    int seconds = (int) ((ms / 1000) % 60);
    int minutes = (int) (((ms / 1000) / 60) % 60);
    int hours = (int) ((((ms / 1000) / 60) / 60) % 24);

    String sec, min, hrs;
    if(seconds<10)  sec="0"+seconds;
    else            sec= ""+seconds;
    if(minutes<10)  min="0"+minutes;
    else            min= ""+minutes;
    if(hours<10)    hrs="0"+hours;
    else            hrs= ""+hours;

    if(hours == 0)  return min+":"+sec;
    else    return hrs+":"+min+":"+sec;

}
4
iTurki
function convertTime(time) {        
    var millis= time % 1000;
    time = parseInt(time/1000);
    var seconds = time % 60;
    time = parseInt(time/60);
    var minutes = time % 60;
    time = parseInt(time/60);
    var hours = time % 24;
    var out = "";
    if(hours && hours > 0) out += hours + " " + ((hours == 1)?"hr":"hrs") + " ";
    if(minutes && minutes > 0) out += minutes + " " + ((minutes == 1)?"min":"mins") + " ";
    if(seconds && seconds > 0) out += seconds + " " + ((seconds == 1)?"sec":"secs") + " ";
    if(millis&& millis> 0) out += millis+ " " + ((millis== 1)?"msec":"msecs") + " ";
    return out.trim();
}
4
Rajiv

In Java

public static String formatMs(long millis) {
    long hours = TimeUnit.MILLISECONDS.toHours(millis);
    long mins = TimeUnit.MILLISECONDS.toMinutes(millis);
    long secs = TimeUnit.MILLISECONDS.toSeconds(millis);
    return String.format("%dh %d min, %d sec",
            hours,
            mins - TimeUnit.HOURS.toMinutes(hours),
            secs - TimeUnit.MINUTES.toSeconds(mins)
    );
}

Gibt so etwas:

12h 1 min, 34 sec
2
Camilo Silva

Ich würde vorschlagen, beliebige Datums-/Zeitfunktionen/Bibliotheken zu verwenden, die Ihre Sprache/das Framework Ihrer Wahl bereitstellt. Schauen Sie sich auch die Formatierungsfunktionen für Zeichenfolgen an, da sie häufig eine einfache Möglichkeit bieten, Datums-/Zeitstempel zu übergeben und ein für Menschen lesbares Zeichenfolgenformat auszugeben.

2
theraccoonbear
Long expireTime = 69l;
Long tempParam = 0l;

Long seconds = math.mod(expireTime, 60);
tempParam = expireTime - seconds;
expireTime = tempParam/60;
Long minutes = math.mod(expireTime, 60);
tempParam = expireTime - minutes;
expireTime = expireTime/60;
Long hours = math.mod(expireTime, 24);
tempParam = expireTime - hours;
expireTime = expireTime/24;
Long days = math.mod(expireTime, 30);

system.debug(days + '.' + hours + ':' + minutes + ':' + seconds);

Dies sollte ergeben: 0.0: 1: 9

2
Asit

Ihre Entscheidungen sind einfach:

  1. Schreiben Sie den Code für die Konvertierung (dh dividieren Sie durch milliSecondsPerDay, um Tage zu erhalten, und verwenden Sie den Modul, um durch milliSecondsPerHour zu dividieren, um Stunden zu erhalten, und verwenden Sie den Modul, um durch milliSecondsPerMinute und dividieren Sie durch 1000 für Sekunden. MilliSecondsPerMinute = 60000, milliSecondsPerHour milliSecondsPerMinute, milliSecondsPerDay = 24 * milliSecondsPerHour.
  2. Verwenden Sie eine Art Bedienungsroutine. UNIX und Windows haben Strukturen, die Sie aus einem Wert vom Typ Ticks oder Sekunden abrufen können.
2
plinth
Long serverUptimeSeconds = 
    (System.currentTimeMillis() - SINCE_TIME_IN_MILLISECONDS) / 1000;


String serverUptimeText = 
String.format("%d days %d hours %d minutes %d seconds",
serverUptimeSeconds / 86400,
( serverUptimeSeconds % 86400) / 3600 ,
((serverUptimeSeconds % 86400) % 3600 ) / 60,
((serverUptimeSeconds % 86400) % 3600 ) % 60
);
2
Krolique

Warum machst du so etwas nicht:

var ms = 86400;

var Sekunden = ms/1000; //86.4

var Minuten = Sekunden/60; //1.4400000000000002

var Stunden = Minuten/60; //0.024000000000000004

var Tage = Stunden/24; //0.0010000000000000002

Und der Umgang mit der Genauigkeit von Schwimmern, z. Zahl (zu fixierende Minuten (5)) //1.44

2
Pavel Blagodov

Ich schlage vor, http://www.ocpsoft.org/prettytime/ Bibliothek zu verwenden.

es ist sehr einfach, ein Zeitintervall in einer für Menschen lesbaren Form zu erhalten

PrettyTime p = new PrettyTime(); System.out.println(p.format(new Date()));

es wird wie "Momente von jetzt" gedruckt

anderes Beispiel

PrettyTime p = new PrettyTime()); Date d = new Date(System.currentTimeMillis()); d.setHours(d.getHours() - 1); String ago = p.format(d);

then string ago = "Vor 1 Stunde"

1
DroidDev

Ein flexibler Weg, dies zu tun:
(Nicht für das aktuelle Datum, aber ausreichend für die Dauer)

/**
convert duration to a ms/sec/min/hour/day/week array
@param {int}        msTime              : time in milliseconds 
@param {bool}       fillEmpty(optional) : fill array values even when they are 0.
@param {string[]}   suffixes(optional)  : add suffixes to returned values.
                                        values are filled with missings '0'
@return {int[]/string[]} : time values from higher to lower(ms) range.
*/
var msToTimeList=function(msTime,fillEmpty,suffixes){
    suffixes=(suffixes instanceof Array)?suffixes:[];   //suffixes is optional
    var timeSteps=[1000,60,60,24,7];    // time ranges : ms/sec/min/hour/day/week
    timeSteps.Push(1000000);    //add very big time at the end to stop cutting
    var result=[];
    for(var i=0;(msTime>0||i<1||fillEmpty)&&i<timeSteps.length;i++){
        var timerange = msTime%timeSteps[i];
        if(typeof(suffixes[i])=="string"){
            timerange+=suffixes[i]; // add suffix (converting )
            // and fill zeros :
            while(  i<timeSteps.length-1 &&
                    timerange.length<((timeSteps[i]-1)+suffixes[i]).length  )
                timerange="0"+timerange;
        }
        result.unshift(timerange);  // stack time range from higher to lower
        msTime = Math.floor(msTime/timeSteps[i]);
    }
    return result;
};

Hinweis: Sie können auch Zeitschritte als Parameter festlegen, wenn Sie die Zeitbereiche steuern möchten.

wie benutzt man (kopiere einen Test):

var elsapsed = Math.floor(Math.random()*3000000000);

console.log(    "elsapsed (labels) = "+
        msToTimeList(elsapsed,false,["ms","sec","min","h","days","weeks"]).join("/")    );

console.log(    "half hour : "+msToTimeList(elsapsed,true)[3]<30?"first":"second"   );

console.log(    "elsapsed (classic) = "+
        msToTimeList(elsapsed,false,["","","","","",""]).join(" : ")    );
1
yorg

Das ist eine Lösung. Später können Sie durch ":" teilen und die Werte des Arrays übernehmen

/**
 * Converts milliseconds to human readeable language separated by ":"
 * Example: 190980000 --> 2:05:3 --> 2days 5hours 3min
 */
function dhm(t){
    var cd = 24 * 60 * 60 * 1000,
        ch = 60 * 60 * 1000,
        d = Math.floor(t / cd),
        h = '0' + Math.floor( (t - d * cd) / ch),
        m = '0' + Math.round( (t - d * cd - h * ch) / 60000);
    return [d, h.substr(-2), m.substr(-2)].join(':');
}

var delay = 190980000;                   
var fullTime = dhm(delay);
console.log(fullTime);
1
ssamuel68

Hier ist meine Lösung mit TimeUnit.

UPDATE: Ich sollte darauf hinweisen, dass dies in Groovy geschrieben ist, aber Java ist fast identisch.

def remainingStr = ""

/* Days */
int days = MILLISECONDS.toDays(remainingTime) as int
remainingStr += (days == 1) ? '1 Day : ' : "${days} Days : "
remainingTime -= DAYS.toMillis(days)

/* Hours */
int hours = MILLISECONDS.toHours(remainingTime) as int
remainingStr += (hours == 1) ? '1 Hour : ' : "${hours} Hours : "
remainingTime -= HOURS.toMillis(hours)

/* Minutes */
int minutes = MILLISECONDS.toMinutes(remainingTime) as int
remainingStr += (minutes == 1) ? '1 Minute : ' : "${minutes} Minutes : "
remainingTime -= MINUTES.toMillis(minutes)

/* Seconds */
int seconds = MILLISECONDS.toSeconds(remainingTime) as int
remainingStr += (seconds == 1) ? '1 Second' : "${seconds} Seconds"
1
dafunker

Ich kann die erste Antwort auf Ihre Frage nicht kommentieren, aber es gibt einen kleinen Fehler. Sie sollten parseInt oder Math.floor verwenden, um Gleitkommazahlen in Ganzzahlen zu konvertieren, d.h.

var days, hours, minutes, seconds, x;
x = ms / 1000;
seconds = Math.floor(x % 60);
x /= 60;
minutes = Math.floor(x % 60);
x /= 60;
hours = Math.floor(x % 24);
x /= 24;
days = Math.floor(x);

Persönlich benutze ich CoffeeScript in meinen Projekten und mein Code sieht so aus:

getFormattedTime : (ms)->
        x = ms / 1000
        seconds = Math.floor x % 60
        x /= 60
        minutes = Math.floor x % 60
        x /= 60
        hours = Math.floor x % 24
        x /= 24
        days = Math.floor x
        formattedTime = "#{seconds}s"
        if minutes then formattedTime = "#{minutes}m " + formattedTime
        if hours then formattedTime = "#{hours}h " + formattedTime
        formattedTime 
1
Rafal Pastuszak

Hier ist eine genauere Methode in Java, ich habe diese einfache Logik implementiert, hoffe, dies wird Ihnen helfen:

    public String getDuration(String _currentTimemilliSecond)
    {
        long _currentTimeMiles = 1;         
        int x = 0;
        int seconds = 0;
        int minutes = 0;
        int hours = 0;
        int days = 0;
        int month = 0;
        int year = 0;

        try 
        {
            _currentTimeMiles = Long.parseLong(_currentTimemilliSecond);
            /**  x in seconds **/   
            x = (int) (_currentTimeMiles / 1000) ; 
            seconds = x ;

            if(seconds >59)
            {
                minutes = seconds/60 ;

                if(minutes > 59)
                {
                    hours = minutes/60;

                    if(hours > 23)
                    {
                        days = hours/24 ;

                        if(days > 30)
                        {
                            month = days/30;

                            if(month > 11)
                            {
                                year = month/12;

                                Log.d("Year", year);
                                Log.d("Month", month%12);
                                Log.d("Days", days % 30);
                                Log.d("hours ", hours % 24);
                                Log.d("Minutes ", minutes % 60);
                                Log.d("Seconds  ", seconds % 60);   

                                return "Year "+year + " Month "+month%12 +" Days " +days%30 +" hours "+hours%24 +" Minutes "+minutes %60+" Seconds "+seconds%60;
                            }
                            else
                            {
                                Log.d("Month", month);
                                Log.d("Days", days % 30);
                                Log.d("hours ", hours % 24);
                                Log.d("Minutes ", minutes % 60);
                                Log.d("Seconds  ", seconds % 60);   

                                return "Month "+month +" Days " +days%30 +" hours "+hours%24 +" Minutes "+minutes %60+" Seconds "+seconds%60;
                            }

                        }
                        else
                        {
                            Log.d("Days", days );
                            Log.d("hours ", hours % 24);
                            Log.d("Minutes ", minutes % 60);
                            Log.d("Seconds  ", seconds % 60);   

                            return "Days " +days +" hours "+hours%24 +" Minutes "+minutes %60+" Seconds "+seconds%60;
                        }

                    }
                    else
                    {
                        Log.d("hours ", hours);
                        Log.d("Minutes ", minutes % 60);
                        Log.d("Seconds  ", seconds % 60);

                        return "hours "+hours+" Minutes "+minutes %60+" Seconds "+seconds%60;
                    }
                }
                else
                {
                    Log.d("Minutes ", minutes);
                    Log.d("Seconds  ", seconds % 60);

                    return "Minutes "+minutes +" Seconds "+seconds%60;
                }
            }
            else
            {
                Log.d("Seconds ", x);
                return " Seconds "+seconds;
            }
        }
        catch (Exception e) 
        {
            Log.e(getClass().getName().toString(), e.toString());
        }
        return "";
    }

    private Class Log
    {
        public static void d(String tag , int value)
        {
            System.out.println("##### [ Debug ]  ## "+tag +" :: "+value);
        }
    }
0
AK Joshi