كيفية تحويل المللي ثانية إلى شكل يمكن قراءته بواسطة الإنسان؟

StackOverflow https://stackoverflow.com/questions/175554

سؤال

أحتاج إلى تحويل كمية عشوائية من المللي ثانية إلى أيام وساعات ودقائق ثانية.

على سبيل المثال:10 أيام، 5 ساعات، 13 دقيقة، ثانية واحدة.

هل كانت مفيدة؟

المحلول

حسنا، لأن لا أحد آخر قد صعدت، أنا أكتب رمز السهل القيام بذلك:

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

وأنا سعيد لمجرد أنك توقفت عند أيام ولم يطلب لعدة أشهر. :)

لاحظ أن في ما سبق، فمن المفترض أن يمثل / اقتطاع قسمة عدد صحيح. إذا كنت تستخدم هذا الرمز في لغة حيث يمثل / العائمة تقسيم نقطة، وسوف تحتاج إلى اقتطاع نتائج تقسيم يدويا حسب الحاجة.

نصائح أخرى

واسمحوا تكون كمية ميلي ثانية. ثم لديك:

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

ووهلم جرا (% هي المشغل معامل).

وآمل أن يساعد هذا.

كلا الحلول أدناه تستخدم جافا سكريبت (لم يكن لدي أي فكرة أن الحل كان محايدًا للغة!).سيلزم تمديد كلا الحلين في حالة التقاط المدد > 1 month.

الحل 1:استخدم كائن التاريخ

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"

أباتشي العموم لانج لها <لأ href = "http://commons.apache.org/proper/commons-lang /javadocs/api-3.1/index.html؟org/apache/commons/lang3/time/DurationFormatUtils.html">DurationFormatUtils التي لديها أساليب مفيدة جدا مثل <وأ href = "HTTP: //commons.apache. غزاله / المناسبة / المشاعات لانغ / javadocs / API-3.1 / المنظمة / اباتشي / المشاعات / lang3 / الوقت / DurationFormatUtils.html # formatDurationWords٪ 28long،٪ 20boolean،٪ 20boolean٪ 29 "> formatDurationWords .

ويجب استخدام وظائف التاريخ والوقت مهما كانت اللغة التي تستخدمها، ولكن فقط من أجل المتعة هنا هو رمز:

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;

وهذه هي طريقة كتبته. فإنه يأخذ 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;

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

وأود أن أقترح استخدام أيا كان تاريخ / وظائف الوقت / مكتبات لغتك / إطار خيار يتيح. كما تحقق من وظائف تنسيق سلسلة لأنها في كثير من الأحيان توفير طرق سهلة لتمرير التاريخ / الطوابع الزمنية والمخرجات شكل سلسلة مقروء الإنسان.

اختياراتك بسيطة:

  1. اكتب الكود لإجراء التحويل (على سبيل المثال، القسمة على milliSecondsPerDay للحصول على الأيام واستخدام المعامل للقسمة على milliSecondsPerHour للحصول على الساعات واستخدام المعامل للقسمة على milliSecondsPerMinute والقسمة على 1000 للثواني.milliSecondsPerMinute = 60000، milliSecondsPerHour = 60 * milliSecondsPerMinute، milliSecondsPerDay = 24 * milliSecondsPerHour.
  2. استخدم روتين التشغيل من نوع ما.يحتوي كل من UNIX وWindows على بنيات يمكنك الحصول عليها من قيمة نوع التجزئة أو الثواني.
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);

وهذا يجب طباعة: 0.0: 1: 9

لماذا فقط لا تفعل شيئا من هذا القبيل:

والسيدة فار = 86400؛

وفار ثواني = مللي / 1000. //86.4

وفار دقيقة = ثانية / 60. //1.4400000000000002

وساعات فار = دقيقة / 60. //0.024000000000000004

وأيام فار = ساعات / 24. //0.0010000000000000002

والتعامل مع تعويم الدقة على سبيل المثال عدد (minutes.toFixed (5)) //1.44

في جافا

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

وأنا لست قادرا على التعليق الجواب الأول على سؤالك، ولكن هناك خطأ صغير. يجب عليك استخدام parseInt أو Math.floor لتحويل أرقام النقطة العائمة إلى عدد صحيح، أنا

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

وشخصيا، وأنا استخدم CoffeeScript في مشاريعي وقانون بلدي يشبه ما يلي:

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 

وهذا هو الحل. بعد ذلك يمكنك تقسيم بواسطة ":" وأخذ قيم مجموعة

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

إليك الحل الخاص بي باستخدام TIMEUNIT.

وUPDATE: أود أن أشير إلى أن هذا هو مكتوب في رائع، ولكن جافا مطابق تقريبا

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"

طريقة مرنة للقيام بذلك:
(لم يتم إعداده للتاريخ الحالي ولكنه جيد بما يكفي لفترات)

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

ملحوظة:يمكنك أيضًا تعيين timeSteps كمعلمة إذا كنت تريد التحكم في النطاقات الزمنية.

كيفية الاستخدام (نسخ اختبار):

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

وأقترح استخدام http://www.ocpsoft.org/prettytime/ مكتبة ..

وانها بسيطة جدا للحصول على فترة زمنية في شكل مقروء الإنسان مثل

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

وأنه سيتم طباعة مثل "لحظات من الآن"

والمثال الآخر

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

وبعد ذلك سلسلة قبل = "1 منذ ساعة"

وهنا هو طريقة أكثر دقة في JAVA، لقد نفذت هذا المنطق البسيط، ونأمل أن يساعدك هذا:

    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);
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top