문제

임의의 양의 밀리 초를 며칠, 몇 시간, 몇 분으로 변환해야합니다.

예 : 10 일, 5 시간, 13 분, 1 초.

도움이 되었습니까?

해결책

글쎄, 아무도 한 단계 더 발전하지 않았기 때문에, 나는 이것을하기 위해 쉬운 코드를 쓸 것이다.

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

나는 당신이 며칠에 멈추고 몇 달을 요구하지 않았기 때문에 기쁘다. :)

위에서는 / 잘린 정수 부서를 나타냅니다. 이 코드를 언어로 사용하는 경우 / 플로팅 포인트 부서를 나타내 든, 필요에 따라 부서 결과를 수동으로 자리게해야합니다.

다른 팁

a를 밀리 초의 양으로합시다. 그런 다음 당신은 다음과 같습니다.

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"

Apache Commons Lang a durationformatutils 그것은 매우 유용한 방법이 있습니다 FormatDurationWords.

사용중인 언어의 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;

이것은 내가 쓴 방법입니다. 필요합니다 integer milliseconds value 그리고 반환 a 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로 나누고 모듈러스를 사용하여 Millisecondsperhour로 나뉘어 시간을 얻고 모듈러스를 Millisecondsperminute로 나누고 몇 초 동안 1000으로 나눕니다. millisecondsperminute, millisecondsperhour = 60 *. millisecondsperminute, millisecondsperday = 24 * millisecondsperhour.
  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
);
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

왜 이런 일을하지 않는 이유 :

var ms = 86400;

var seconds = ms / 1000; //86.4

var 분 = 초 / 60; //1.4400000000000002

var 시간 = 분 / 60; //0.024000000000000004

var 일 = 시간 / 24; //0.0010000000000000002

및 플로트 정밀도 EG 번호를 다루는 (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);

개인적으로 저는 프로젝트에 커피 스크립트를 사용하고 코드는 다음과 같습니다.

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을 사용한 내 솔루션은 다음과 같습니다.

업데이트 : 나는 이것이 Groovy로 작성되었지만 Java는 거의 동일하다는 것을 지적해야합니다.

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

NB : 당신도 설정할 수 있습니다 타임 스텝 시간 범위를 제어하려면 매개 변수로

사용 방법 (테스트 복사) :

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

그런 다음 String Ago = "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