Wie Millisekunden in für Menschen lesbare Form zu konvertieren?
-
05-07-2019 - |
Frage
Ich brauche eine beliebige Anzahl von Millisekunden in Tage, Stunden, Minuten Zweite konvertieren.
. Zum Beispiel: 10 Tage, 5 Stunden, 13 Minuten, 1 Sekunde
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.
passierenSie haben die Wahl einfach:
- 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.
- 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 werdenanderes 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);
}
}