Как конвертировать миллисекунды в удобочитаемую форму? - PullRequest
117 голосов
/ 06 октября 2008

Мне нужно преобразовать произвольное количество миллисекунд в Дни, Часы, Минуты, Вторые.

Например: 10 дней, 5 часов, 13 минут, 1 секунда.

Ответы [ 19 ]

221 голосов
/ 06 октября 2008

Ну, так как никто больше не подошел, я напишу простой код для этого:

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

Я просто рад, что вы остановились на днях и не спрашивали месяцами. :)

Обратите внимание, что в приведенном выше примере предполагается, что / представляет усеченное целочисленное деление. Если вы используете этот код на языке, где / представляет деление с плавающей запятой, вам потребуется вручную обрезать результаты деления по мере необходимости.

56 голосов
/ 06 октября 2008

Пусть A будет количеством миллисекунд. Тогда у вас есть:

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

и т. Д. (% - оператор модуля).

Надеюсь, это поможет.

24 голосов
/ 14 сентября 2012

Оба решения ниже используют javascript (я понятия не имел, что решение не зависело от языка!). Оба решения необходимо будет расширить, если продолжительность захвата > 1 month.

Решение 1. Используйте объект Date

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

Дает:

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

Библиотеки полезны, но зачем использовать библиотеку, если вы можете заново изобрести колесо! :)

Решение 2: написать свой собственный парсер

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

Создает объект «длительность» с любыми необходимыми полями. Форматирование отметки времени становится простым ...

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

Дает:

"6 days, 5 hours, 4 minutes, 3 seconds, 21 millis"
20 голосов
/ 09 ноября 2011

Apache Commons Lang имеет DurationFormatUtils , который имеет очень полезные методы, такие как formatDurationWords .

7 голосов
/ 06 октября 2008

Вы должны использовать функции datetime на любом языке, который вы используете, но просто для развлечения вот код:

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 голосов
/ 10 января 2012

Это метод, который я написал. Он принимает integer milliseconds value и возвращает 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 голосов
/ 31 октября 2012
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 голосов
/ 15 октября 2010
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 голосов
/ 06 октября 2008

Ваш выбор прост:

  1. Напишите код для преобразования (т. Е. Разделите на milliSecondsPerDay, чтобы получить дни, и используйте модуль, чтобы разделить на milliSecondsPerHour, чтобы получить часы, и используйте модуль, чтобы разделить на milliSecondsPerMinute и разделить на 1000 за секунды. MilliSecondsPerMinute = 60000, milliSeconds = 60 * миллисекундPerMinute, milliSecondsPerDay = 24 * миллисекундPerHour.
  2. Используйте какой-нибудь режим работы. В UNIX и Windows есть структуры, которые можно получить из значения типа Ticks или секунд.
2 голосов
/ 13 августа 2016

В Яве

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

Дает что-то вроде этого:

12h 1 min, 34 sec
...