Bagaimana cara mengubah milidetik menjadi bentuk yang dapat dibaca manusia?


118

Saya perlu mengubah jumlah milidetik yang sewenang-wenang menjadi Hari, Jam, Menit Detik.

Misalnya: 10 Hari, 5 jam, 13 menit, 1 detik.


"Bahasa yang saya gunakan tidak memiliki ini, kalau tidak saya akan menggunakannya." Saya merasa sulit untuk mengerti. Bahasa apa? OS apa?
S. Lott

ActionScript, OS apa pun, memiliki dukungan tanggal / waktu yang menyedihkan
FlySwat

3
Saya tidak tahu bahasa apa pun yang memiliki apa yang dia minta, saya juga tidak melihat alasan mengapa itu terjadi. Beberapa matematika divisi / modulus yang sangat sederhana mendapatkan jawabannya dengan baik.
Kip

1
Tidak semua tahun memiliki jumlah hari yang sama, jadi Anda harus menyatakan periode yang mana. Atau mungkin, Anda hanya menginginkannya di tahun 'standar' (365.sesuatu)?
Milan Babuškov

@Kip: Mengerti - salah membaca pertanyaan - memikirkan cap waktu OS dalam milidetik. Bukan waktu atau interval delta. Tergoda untuk mengedit pertanyaan ...
S. Lott

Jawaban:


226

Nah, karena tidak ada orang lain yang melangkah, saya akan menulis kode mudah untuk melakukan ini:

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

Saya senang Anda berhenti pada hari-hari dan tidak meminta berbulan-bulan. :)

Perhatikan bahwa di atas, diasumsikan itu /mewakili pembagian integer pemotongan. Jika Anda menggunakan kode ini dalam bahasa yang /merepresentasikan pembagian floating point, Anda perlu memotong hasil pembagian secara manual sesuai kebutuhan.


2
Baru saja digunakan dalam fungsi flash. Terima kasih! (suara positif untuk kesederhanaan)
Makram Saleh

2
Ini tidak bekerja dengan benar. Harus menggunakan parseInt saat menggunakan pembagi jika tidak, Anda akan melihat nilai float panjang. Lihat jawaban saya di bawah untuk solusi yang lebih komprehensif.
Rajiv

17
@Greg Hewgill Saya senang Anda berhenti di hari dan tidak meminta berbulan-bulan. :) haha :)
moshfiqur

58

Misalkan A adalah jumlah milidetik. Maka Anda memiliki:

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

dan seterusnya ( %adalah operator modulus).

Semoga ini membantu.


@sabbibJAVA 24 seharusnya sudah bekerja. Kamu dalam bahasa apa Jika /melakukan pembagian floating point, Anda perlu memotong nilainya. Diasumsikan dalam jawaban lain yang /melakukan pembagian integer.
Brian J

24

Kedua solusi di bawah ini menggunakan javascript (saya tidak tahu solusinya adalah bahasa agnostik!). Kedua solusi perlu diperpanjang jika merekam durasi > 1 month.

Solusi 1: Gunakan objek Tanggal

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

Memberikan:

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

Perpustakaan sangat membantu, tetapi mengapa menggunakan perpustakaan ketika Anda dapat menemukan kembali roda! :)

Solusi 2: Tulis parser Anda sendiri

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

Membuat objek "durasi", dengan bidang apa pun yang Anda butuhkan. Memformat stempel waktu menjadi sederhana ...

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

Memberikan:

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

Ubah baris itu menjadi tunggal dan jamak return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
Phillip Kamikaze

1
@PhillipKamikaze Terima kasih Phillip! Saya telah memasukkan saran Anda.
Nick Grealy

Anda mungkin tidak ingin menampilkan segmen dengan nilai nol, jadi filter berikut dapat ditambahkan ... 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
Terima kasih @RuslanUlanov! Saya telah menambahkannya ke contoh (meskipun dengan sedikit modifikasi untuk memeriksa apakah nomornya "benar").
Nick Grealy


7

Anda harus menggunakan fungsi datetime dari bahasa apa pun yang Anda gunakan, tetapi, berikut kodenya hanya untuk bersenang-senang:

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

Ini adalah metode yang saya tulis. Dibutuhkan integer milliseconds valuedan mengembalikan 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

Saya akan menyarankan menggunakan fungsi tanggal / waktu / perpustakaan apa pun yang disediakan oleh bahasa / kerangka kerja pilihan Anda. Periksa juga fungsi pemformatan string karena sering memberikan cara mudah untuk melewatkan tanggal / cap waktu dan menghasilkan format string yang dapat dibaca manusia.


2

Pilihan Anda sederhana:

  1. Tulis kode untuk melakukan konversi (yaitu, bagi dengan miliSecondsPerDay untuk mendapatkan hari dan gunakan modulus untuk membagi dengan miliSecondsPerHour untuk mendapatkan jam dan gunakan modulus untuk membagi dengan miliSecondsPerMinute dan bagi dengan 1000 untuk detik. MiliSecondsPerMinute = 60.000, miliSecond = 60 milliSecondsPerMinute, milliSecondsPerDay = 24 * milliSecondsPerHour.
  2. Gunakan semacam rutinitas pengoperasian. UNIX dan Windows keduanya memiliki struktur yang dapat Anda peroleh dari nilai tipe Kutu atau detik.

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

Ini harus mencetak: 0.0: 1: 9


2

Mengapa tidak melakukan sesuatu seperti ini:

var ms = 86400;

var detik = ms / 1000; //86.4

var menit = detik / 60; //1.4400000000000002

var jam = menit / 60; //0.024000000000000004

var hari = jam / 24; //0.0010000000000000002

Dan menangani presisi float misalnya Number (minutes.toFixed (5)) //1.44


2

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

Memberikan sesuatu seperti ini:

12h 1 min, 34 sec

1

Saya tidak bisa mengomentari jawaban pertama atas pertanyaan Anda, tetapi ada kesalahan kecil. Anda harus menggunakan parseInt atau Math.floor untuk mengubah bilangan floating point menjadi integer, 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);

Secara pribadi, saya menggunakan CoffeeScript dalam proyek saya dan kode saya terlihat seperti itu:

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

Ini solusinya. Nanti Anda dapat memisahkan dengan ":" dan mengambil nilai dari array

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

Inilah solusi saya menggunakan TimeUnit.

UPDATE: Saya harus menunjukkan bahwa ini ditulis dengan groovy, tetapi Java hampir identik.

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

Cara fleksibel untuk melakukannya:
(Tidak dibuat untuk tanggal sekarang tetapi cukup baik untuk jangka waktu tertentu)

/**
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: Anda juga dapat mengatur timeSteps sebagai parameter jika Anda ingin mengontrol rentang waktu.

cara menggunakan (menyalin tes):

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

Saya menyarankan untuk menggunakan http://www.ocpsoft.org/prettytime/ library ..

sangat mudah untuk mendapatkan interval waktu dalam bentuk yang dapat dibaca manusia seperti

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

itu akan mencetak seperti "momen dari sekarang"

contoh lainnya

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

lalu string ago = "1 hour ago"


0

Berikut adalah metode yang lebih tepat di JAWA, saya telah menerapkan logika sederhana ini, semoga ini akan membantu Anda:

    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);
        }
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.