밀리 초를 사람이 읽을 수있는 형식으로 변환하는 방법은 무엇입니까?


118

임의의 밀리 초를 일, 시간, 분 초로 변환해야합니다.

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


"내가 사용하는 언어에는이 기능이 내장되어 있지 않습니다. 그렇지 않으면 사용하겠습니다." 이해하기 어렵습니다. 어떤 언어? 어떤 OS?
S.Lott

ActionScript, 모든 OS, 비참한 날짜 / 시간 지원
FlySwat

3
나는 그가 요구하는 언어를 알지 못하며 그럴 이유도 알지 못한다. 아주 간단한 나누기 / 계수 수학은 답을 잘 얻습니다.
Kip

1
모든 연도에 동일한 일수가있는 것은 아니므로 어느 기간 이었는지 명시해야합니다. 아니면 그냥 '표준'연도 (365. 뭔가)에 그것을 원하십니까?
Milan Babuškov

@Kip : 알았어요-질문을 잘못 읽으세요-OS 타임 스탬프를 밀리 초 단위로 생각하고있었습니다. 델타 시간이나 간격이 아닙니다. 질문을 편집하고 싶은 유혹을 ...
S.Lott

답변:


226

글쎄요, 아무도 발을 들여 놓지 않았기 때문에 저는 이것을하기위한 쉬운 코드를 작성할 것입니다 :

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

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

위의 경우 /정수 나누기 자르기 를 나타내는 것으로 가정합니다 . /부동 소수점 나누기를 나타내는 언어로이 코드를 사용하는 경우 필요에 따라 나누기 결과를 수동으로 잘라야합니다.


2
플래시 기능에서 사용했습니다. 감사! (단순함을 위해
찬성

2
제대로 작동하지 않습니다. 제수를 사용할 때 parseInt를 사용해야합니다. 그렇지 않으면 long float 값이 표시됩니다. 보다 포괄적 인 솔루션은 아래 내 대답을 참조하십시오.
Rajiv

17
@Greg Hewgill 나는 당신이 며칠에 멈추고 몇 달 동안 요청하지 않았다는 것이 기쁩니다. :) haha :)
moshfiqur

58

A를 밀리 초로 설정합니다. 그런 다음 :

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

등 ( %은 모듈러스 연산자).

도움이 되었기를 바랍니다.


@sabbibJAVA 24가 작동 했어야합니다. 어떤 언어를 사용하십니까? 경우 /포인트 부문 부동 않습니다, 당신은 값을 절단해야합니다. /정수 나누기를 수행하는 다른 답변에서 가정 합니다.
Brian J

24

아래의 두 솔루션 모두 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"

단수 및 복수 얻기 위해 그 줄을 변경 return dur[u.label] + " " + (dur[u.label]==1?u.label.slice(0,-1):u.label);
필립 가미

1
@PhillipKamikaze 필립 감사합니다! 나는 당신의 제안을 통합했습니다.
Nick Grealy 2015

다음 필터를 추가 할 수 있도록 당신은 아마, 0 값으로 세그먼트를 보여주고 싶지 않아 ... 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(', '); };
루슬란 Ulanov

1
감사합니다 @RuslanUlanov! 나는 그것을 예제에 추가했다 (그러나 숫자가 "참"인지 확인하기 위해 약간 수정 했음에도 불구하고).
Nick Grealy


7

사용하는 언어에 관계없이 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

이것은 내가 쓴 방법입니다. 를 취하고 다음 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
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

선택한 언어 / 프레임 워크가 제공하는 날짜 / 시간 함수 / 라이브러리를 사용하는 것이 좋습니다. 또한 날짜 / 타임 스탬프를 전달하고 사람이 읽을 수있는 문자열 형식을 출력하는 쉬운 방법을 제공하는 문자열 형식 지정 함수도 확인하십시오.


2

선택은 간단합니다.

  1. 변환을 수행하는 코드를 작성하십시오 (즉, 일을 얻으려면 milliSecondsPerDay로 나누고, 시간을 얻으려면 계수를 milliSecondsPerHour로 나누고, 계수를 사용하여 milliSecondsPerMinute로 나누고 초 동안 1000으로 나누십시오 .milliSecondsPerMinute = 60000, milliSecondsPerHour = 60 * milliSecondsPerMinute, milliSecondsPerDay = 24 * milliSecondsPerHour.
  2. 어떤 종류의 작동 루틴을 사용하십시오. UNIX와 Windows에는 모두 Ticks 또는 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);

다음과 같이 출력되어야합니다. 0.0 : 1 : 9


2

다음과 같이하지 않는 이유 :

var ms = 86400;

var 초 = ms / 1000; //86.4

var 분 = 초 / 60; //1.4400000000000002

var 시간 = 분 / 60; //0.024000000000000004

var days = hours / 24; //0.0010000000000000002

그리고 float 정밀도를 다룹니다. 예 : Number (minutes.toFixed (5)) //1.44


2

자바에서

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

1

귀하의 질문에 대한 첫 번째 답변에 대해 설명 할 수는 없지만 작은 실수가 있습니다. 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 

1

이것이 해결책입니다. 나중에 ":"로 분할하고 배열 값을 가져올 수 있습니다.

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

TimeUnit을 사용하는 내 솔루션은 다음과 같습니다.

업데이트 : 이것이 그루비로 작성되었지만 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"

1

유연한 방법 :
(현재 날짜에 적합하지 않지만 기간 동안 충분 함)

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

1

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

then string ago = "1 시간 전"


0

다음은 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);
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.