Wie konvertiere ich Millisekunden in lesbare Form?


118

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

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


"In der Sprache, die ich verwende, ist dies nicht integriert, sonst würde ich es verwenden." Ich finde das schwer zu verstehen. Welche Sprache? Welches Betriebssystem?
S.Lott

ActionScript, jedes Betriebssystem, es hat miserable Datums- /
Zeitunterstützung

3
Ich kenne keine Sprache, die das hat, wonach er fragt, und ich sehe auch keinen Grund dafür. Einige sehr einfache Divisions- / Modul-Berechnungen erhalten die Antwort ganz gut.
Kip

1
Nicht alle Jahre haben die gleiche Anzahl von Tagen, daher müssten Sie angeben, um welchen Zeitraum es sich handelt. Oder möchten Sie es einfach nur in "Standard" -Jahren (365. etwas)?
Milan Babuškov

@Kip: Verstanden - die Frage falsch verstanden - dachte an OS-Zeitstempel in Millisekunden. Keine Deltazeiten oder Intervalle. Versuchung, die Frage zu bearbeiten ...
S.Lott

Antworten:


225

Nun, da niemand anderes aufgestiegen ist, schreibe ich den einfachen Code, 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 angehalten hast und seit Monaten nicht mehr gefragt hast. :) :)

Beachten Sie, dass oben angenommen wird, dass dies /das Abschneiden einer ganzzahligen Division darstellt. Wenn Sie diesen Code in einer Sprache verwenden, in der /die Gleitkommadivision dargestellt wird, müssen Sie die Ergebnisse der Division nach Bedarf manuell abschneiden.


2
Ich habe das gerade in einer Flash-Funktion verwendet. Vielen Dank! (der Einfachheit halber positiv bewertet)
Makram Saleh

2
Es funktioniert nicht richtig. Sollte parseInt verwendet werden, wenn der Divisor verwendet wird, da sonst lange Gleitkommawerte angezeigt werden. In meiner Antwort unten finden Sie eine umfassendere Lösung.
Rajiv

16
@ Greg Hewgill Ich bin nur froh, dass du an Tagen stehen geblieben bist und nicht nach Monaten gefragt hast. :) haha :)
moshfiqur

58

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.


@sabbibJAVA 24 hätte funktionieren sollen. In welcher Sprache bist du? Wenn eine /Gleitkommadivision durchgeführt wird, müssen Sie den Wert abschneiden. In anderen Antworten wird angenommen, dass /eine Ganzzahldivision durchgeführt wird.
Brian J

24

Beide Lösungen verwenden Javascript (ich hatte keine Ahnung, dass die Lösung sprachunabhängig ist!). Beide Lösungen müssen erweitert werden, wenn die Dauer erfasst wird> 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 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 "Dauer" -Objekt mit den 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"

Ändern Sie diese Zeile, um Singular und Plural zu erhalten return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
Phillip Kamikaze

1
@PhillipKamikaze Danke Phillip! Ich habe Ihren Vorschlag aufgenommen.
Nick Grealy

Sie möchten wahrscheinlich keine Segmente mit Nullwerten anzeigen, daher könnte der folgende Filter hinzugefügt werden ... var nonZero = function(u){ return !u.startsWith("0"); }; // convert object to a string representation... dur.toString = function(){ return units.reverse().map(function(u){ return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label); }).filter(nonZero).join(', '); };
Ruslan Ulanov

1
Danke @RuslanUlanov! Ich habe es dem Beispiel hinzugefügt (allerdings mit einer geringfügigen Änderung, um zu überprüfen, ob die Zahl "wahr" ist).
Nick Grealy


7

Sie sollten die datetime-Funktionen der von Ihnen verwendeten Sprache verwenden, aber 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;

4

Dies ist eine Methode, die ich geschrieben habe. Es dauert ein integer milliseconds valueund 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
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();
}

2

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


2

Ihre Auswahl ist 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 zu dividieren, und dividieren Sie durch 1000 für Sekunden. MilliSecondsPerMinute = 60000, milliSecondsPerHour = 60 * milliSecondsPerMinute, milliSecondsPerDay = 24 * milliSecondsPerHour.
  2. Verwenden Sie eine Betriebsroutine. UNIX und Windows haben beide Strukturen, die Sie aus einem Wert vom Typ Ticks oder Sekunden erhalten können.

2
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
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 gedruckt werden: 0.0: 1: 9


2

Warum einfach nicht so etwas tun:

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 Umgang mit Float-Präzision, zB Number (Minuten.Fixiert (5)) //1.44


2

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

1

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 umzuwandeln, 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 verwende ich CoffeeScript in meinen Projekten und mein Code sieht folgendermaßen 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

Dies 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

Hier ist meine Lösung mit TimeUnit.

UPDATE: Ich sollte darauf hinweisen, dass dies in groovig 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

Ein flexibler Weg, dies zu tun:
(Nicht für das aktuelle Datum gemacht, aber gut genug 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;
};

NB: Sie können auch timeSteps einstellen als Parameter , wenn Sie die steuern möchten.

Verwendung (Kopieren eines Tests):

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

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

Es ist sehr einfach, Zeitintervalle in lesbarer Form zu erhalten

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

Es wird wie "Momente von jetzt an" gedruckt.

anderes Beispiel

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

dann string vor = "vor 1 Stunde"


0

Hier ist eine genauere Methode in JAVA. Ich habe diese einfache Logik implementiert. Ich 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);
        }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.