밀리 초를 인간 읽을 수있는 형태로 변환하는 방법은 무엇입니까?
-
05-07-2019 - |
문제
임의의 양의 밀리 초를 며칠, 몇 시간, 몇 분으로 변환해야합니다.
예 : 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();
}
선택한 언어/프레임 워크가 제공하는 날짜/시간 기능/라이브러리를 사용하는 것이 좋습니다. 또한 문자열 서식 함수는 종종 날짜/타임 스탬프를 쉽게 전달하고 사람이 읽을 수있는 문자열 형식을 출력하는 쉬운 방법을 제공하므로 확인하십시오.
귀하의 선택은 간단합니다.
- 전환을 수행하기위한 코드를 작성하십시오 (즉, Millisecondsperday로 나누기 위해 Millisecondsperhour로 나누고 모듈러스를 사용하여 Millisecondsperhour로 나뉘어 시간을 얻고 모듈러스를 Millisecondsperminute로 나누고 몇 초 동안 1000으로 나눕니다. millisecondsperminute, millisecondsperhour = 60 *. millisecondsperminute, millisecondsperday = 24 * millisecondsperhour.
- 어떤 종류의 운영 루틴을 사용하십시오. 유닉스와 창에는 진드기 또는 초 유형 값에서 얻을 수있는 구조가 있습니다.
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);
}
}