Làm thế nào để chuyển đổi mili giây sang dạng con người có thể đọc được?


118

Tôi cần chuyển đổi một lượng mili giây tùy ý thành Ngày, Giờ, Phút Giây.

Ví dụ: 10 Ngày, 5 giờ, 13 phút, 1 giây.


"Ngôn ngữ tôi đang sử dụng không được tích hợp sẵn tính năng này, nếu không tôi sẽ sử dụng nó." Tôi thấy điều đó thật khó hiểu. Ngôn ngữ nào? Hệ điều hành nào?
S.Lott

ActionScript, bất kỳ hệ điều hành nào, nó đều có hỗ trợ ngày / giờ khó khăn
FlySwat 6/10/08

3
Tôi không biết bất kỳ ngôn ngữ nào có những gì anh ấy yêu cầu, cũng như tôi không biết lý do tại sao lại như vậy. Một số phép toán chia / môđun rất đơn giản sẽ có câu trả lời tốt.
Kip

1
Không phải tất cả các năm đều có cùng số ngày, vì vậy bạn sẽ phải cho biết đó là khoảng thời gian nào. Hoặc có thể, bạn chỉ muốn nó trong những năm 'tiêu chuẩn' (365. gì đó)?
Milan Babuškov

@Kip: OK - đọc sai câu hỏi - đang nghĩ đến dấu thời gian của hệ điều hành tính bằng mili giây. Không phải thời gian hoặc khoảng thời gian delta. Bị cám dỗ để chỉnh sửa câu hỏi ...
S.Lott

Câu trả lời:


226

Chà, vì chưa có ai khác bước lên, tôi sẽ viết đoạn mã đơn giản để làm điều này:

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

Tôi chỉ mừng vì bạn đã dừng lại vài ngày và không hỏi trong nhiều tháng. :)

Lưu ý rằng trong phần trên, nó được giả định là /đại diện cho phép chia số nguyên cắt ngắn. Nếu bạn sử dụng mã này bằng một ngôn ngữ /biểu thị phép chia dấu phẩy động, bạn sẽ cần phải cắt bớt các kết quả của phép chia theo cách thủ công nếu cần.


2
Chỉ sử dụng nó trong một chức năng flash. cảm ơn! (ủng hộ vì đơn giản)
Makram Saleh

2
Nó không hoạt động chính xác. Nên sử dụng parseInt khi sử dụng số chia nếu không bạn sẽ thấy các giá trị float dài. Xem câu trả lời của tôi bên dưới để có giải pháp toàn diện hơn.
Rajiv,

17
@Greg Hewgill Tôi rất vui vì bạn đã dừng lại vài ngày và không hỏi trong nhiều tháng. :) haha :)
moshfiqur

58

Gọi A là số phần nghìn giây. Sau đó bạn có:

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

và như vậy ( %là toán tử mô đun).

Hi vọng điêu nay co ich.


@sabbibJAVA 24 lẽ ra đã hoạt động. Bạn nói ngôn ngữ nào Nếu /thực hiện phép chia dấu phẩy động, bạn cần phải cắt bớt giá trị. Nó được giả định trong các câu trả lời khác /đang thực hiện phép chia số nguyên.
Brian J

24

Cả hai giải pháp bên dưới đều sử dụng javascript (Tôi không biết giải pháp là ngôn ngữ bất khả tri!). Cả hai giải pháp sẽ cần được mở rộng nếu ghi lại thời lượng > 1 month.

Giải pháp 1: Sử dụng đối tượng Ngày

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

Cung cấp:

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

Thư viện rất hữu ích, nhưng tại sao lại sử dụng thư viện khi bạn có thể phát minh lại bánh xe! :)

Giải pháp 2: Viết trình phân tích cú pháp của riêng bạn

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

Tạo đối tượng "thời lượng", với bất kỳ trường nào bạn yêu cầu. Định dạng dấu thời gian sau đó trở nên đơn giản ...

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

Cung cấp:

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

Thay đổi dòng để có được ít và số nhiều return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
Phillip Kamikaze

1
@PhillipKamikaze Cảm ơn Phillip! Tôi đã kết hợp đề xuất của bạn.
Nick Grealy,

Bạn có thể không muốn hiển thị các phân đoạn có giá trị bằng 0, vì vậy, bộ lọc sau có thể được thêm vào ... 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
Cảm ơn @RuslanUlanov! Tôi đã thêm nó vào ví dụ (mặc dù có một chút sửa đổi để kiểm tra xem con số có phải là "sự thật" hay không).
Nick Grealy


7

Bạn nên sử dụng các hàm datetime của bất kỳ ngôn ngữ nào bạn đang sử dụng, nhưng, đây là đoạn mã:

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

Đây là một phương pháp tôi đã viết. Nó nhận một integer milliseconds valuevà trả về một 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

Tôi khuyên bạn nên sử dụng bất kỳ chức năng / thư viện ngày / giờ nào mà ngôn ngữ / khuôn khổ lựa chọn của bạn cung cấp. Ngoài ra, hãy kiểm tra các hàm định dạng chuỗi vì chúng thường cung cấp các cách dễ dàng để chuyển ngày / dấu thời gian và xuất ra định dạng chuỗi có thể đọc được của con người.


2

Lựa chọn của bạn rất đơn giản:

  1. Viết mã để thực hiện chuyển đổi (tức là chia cho milliSecondsPerDay để lấy ngày và sử dụng mô-đun để chia cho milliSecondsPerHour để lấy giờ và sử dụng mô-đun để chia cho milliSecondsPerMinute và chia cho 1000 cho giây. MilliSecondsPerMinute = 60000, milliSecondsPerHour = 60 * milliSecondsPerMinute, milliSecondsPerDay = 24 * milliSecondsPerHour.
  2. Sử dụng một quy trình vận hành nào đó. Cả UNIX và Windows đều có các cấu trúc mà bạn có thể lấy từ giá trị kiểu Ticks hoặc seconds.

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

Điều này sẽ in: 0,0: 1: 9


2

Tại sao không làm điều gì đó như thế này:

var ms = 86400;

var giây = ms / 1000; //86,4

var phút = giây / 60; //1.4400000000000002

var giờ = phút / 60; //0.024000000000000004

var ngày = giờ / 24; //0.0010000000000000002

Và đối phó với độ chính xác float, ví dụ: Number (minutes.toFixed (5)) //1.44


2

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

Cung cấp một cái gì đó như thế này:

12h 1 min, 34 sec

1

Tôi không thể bình luận câu trả lời đầu tiên cho câu hỏi của bạn, nhưng có một sai sót nhỏ. Bạn nên sử dụng parseInt hoặc Math.floor để chuyển đổi số dấu phẩy động thành số nguyên, 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);

Cá nhân tôi sử dụng CoffeeScript trong các dự án của mình và mã của tôi trông như thế:

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

Đây là một giải pháp. Sau đó, bạn có thể chia theo ":" và lấy các giá trị của mảng

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

Đây là giải pháp của tôi bằng cách sử dụng TimeUnit.

CẬP NHẬT: Tôi nên chỉ ra rằng điều này được viết bằng Groovy, nhưng Java gần như giống hệt nhau.

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

Một cách linh hoạt để làm điều đó:
(Không được thực hiện cho ngày hiện tại nhưng đủ tốt cho thời lượng)

/**
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: bạn cũng có thể đặt timeSteps làm tham số nếu bạn muốn kiểm soát phạm vi thời gian.

cách sử dụng (sao chép một bài kiểm tra):

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

Tôi khuyên bạn nên sử dụng thư viện http://www.ocpsoft.org/prettytime/ ..

rất đơn giản để có được khoảng thời gian ở dạng con người có thể đọc được như

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

nó sẽ in như "khoảnh khắc từ bây giờ"

ví dụ khác

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

then string ago = "1 giờ trước"


0

Đây là phương pháp chính xác hơn trong JAVA, tôi đã thực hiện logic đơn giản này, hy vọng điều này sẽ giúp bạn:

    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);
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.