Frage

Ich brauche eine beliebige Anzahl von Millisekunden in Tage, Stunden, Minuten Zweite konvertieren.

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

War es hilfreich?

Lösung

Nun, da niemand sonst verstärkt hat, werde ich den einfachen Code schreiben, 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 Sie an den Tagen gestoppt und fragten nicht für Monate. :)

Beachten Sie, dass in dem obigen wird angenommen, dass / Integer-Division stellt Kürzen. Wenn Sie diesen Code in einer Sprache verwenden, wo / Gleitkomma-Division darstellt, müssen Sie manuell die Ergebnisse der Division gestutzt nach Bedarf.

Andere Tipps

Es sei A die Menge von Millisekunden betragen. Dann haben Sie:

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

und so weiter (% ist der Modulo-Operator).

Hope, das hilft.

Beide Lösungen unter Verwendung Javascript (ich hatte keine Ahnung, war die Lösung sprachunabhängig!). Beiden Lösungen müssen erweitert werden, wenn die Erfassung Dauern > 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! :)

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 eine „Dauer“ Objekt, mit dem, was Felder, die Sie benötigen. Formatieren einen Zeitstempel dann einfach wird ...

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

Gibt:

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

Apache Commons Lang hat eine DurationFormatUtils die sehr hilfreiche Methoden hat wie formatDurationWords .

Sie sollten die Datetime-Funktionen verwenden, welche Sprache Sie verwenden, aber nur zum Spaß hier ist 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;

Dies ist eine Methode, die ich geschrieben habe. Es dauert eine integer milliseconds value und gibt einen 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;

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

Ich würde vorschlagen, was Datum / Zeit-Funktionen / Bibliotheken Ihre Sprache / Framework der Wahl zur Verfügung stellt. Auch String Formatierungsfunktionen überprüfen, da sie oft einfache Möglichkeiten bieten Datum- / Zeitstempel und Ausgabe eines Menschen lesbaren String-Format.

passieren

Sie haben die Wahl einfach:

  1. Schreiben Sie den Code um die Konvertierung zu tun (dh Division durch millisecondsPerDay Tage zu bekommen und den Modul verwenden, indem milliSecondsPerHour aufzuteilen Stunden zu erhalten und den Modul zu teilen, indem er millisecondsPerMinute und dividieren durch 1000 für Sekunden verwenden. MillisecondsPerMinute = 60000, milliSecondsPerHour = 60 * millisecondsPerMinute, millisecondsPerDay = 24 * milliSecondsPerHour.
  2. Verwenden Sie eine Betriebsroutine irgendeiner Art. UNIX und Windows haben beiden Strukturen, die man von einem Tick oder Sekunden Typwert erhalten.
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
);
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 Druck: 0,0: 1: 9

Warum einfach nicht so etwas wie folgt aus:

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 float Präzision z.B. Nummer (minutes.toFixed (5)) //1.44

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 wie folgt aus:

12h 1 min, 34 sec

Ich bin Kommentar auf Ihre Frage nicht in der Lage erste Antwort, aber es gibt einen kleinen Fehler. Sie sollten verwenden parseInt oder Math.floor auf ganzzahlige Gleitkommazahlen zu konvertieren, i

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

Ich persönlich verwenden Coffee in meinen Projekten und mein Code sieht wie folgt 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 

Dies ist eine Lösung. Später können Sie geteilt durch „:“ und die Werte des Arrays nehmen

/**
 * 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);

Hier ist meine Lösung mit Timeunit.

UPDATE:. Ich möchte darauf hinweisen, dass diese in groovy geschrieben, 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"

Eine flexible Art und Weise, es zu tun:
(Nicht für aktuelles Datum gemacht, aber gut genug für eine 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 festlegen Zeitschritte als Parameter, wenn Sie die Zeitbereiche steuern möchten.

Wie verwenden (einen Test kopieren):

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(" : ")    );

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

es ist sehr einfach, Zeitintervall, in für Menschen lesbaren Form wie

bekommen

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

es wie „Momente ab jetzt“

gedruckt werden

anderes Beispiel

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

dann Zeichenfolge vor = "1 Stunde"

Hier präzisere Methode in JAVA ist, ich diese einfache Logik implementiert haben, hoffen, dass diese 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);
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top