2017-03-07 2 views
1

나는 69 시간 41 분 0 초인 69:41:00의 기간 값이있는 곳에서 Google 시트를 사용하고 있습니다. 이것을 일, 시간 및 분으로 변환하는 기능이없는 것 같아서 검색을 수행하고 일부는 사용자 정의 기능을 제안했습니다. 그것이 어떻게 작동하는지 정확히 알지 못했지만 필자가 원했던 부분에 맞게 원래의 것을 약간 변경했습니다. 아래의 코드는 :Google 시트에서 시간 수가 24 시간을 초과하는 기간을 얻으려면 어떻게해야합니까?

/** 
 
* Format Duration to Days,Hours,Minutes 
 
* 
 
* @param {duration} input value. 
 
* @return Days,Hours,Minutes. 
 
* @customfunction 
 
*/ 
 
function FormatDuration(duration) { 
 
    // Retrieve the hours and minutes 
 
    var hrs = duration.getHours();  
 
    var days = Math.floor(hrs/24); 
 
    var hours = hrs % 24; 
 
    var mins = duration.getMinutes(); 
 

 
    // Convert the result to a number to use in calculations 
 
    var result = days + 'd ' + hours + ' h '+ mins+' min'; 
 
    return result; 
 
}

결과는 2D 21H 44 분해야하지만, 대신에 나는 21 시간 35 분 0D 얻었다. 내가 여기서 뭔가 잘못하고있는거야?

답변

1

내가 방금

ʺd\d hh\h mm\mʺ ? 

의 사용자 정의 형식을 사용하지 않는 이유는 잘 작동, 추가 거라고을 찾을 수 있습니다 Excel에서는 있지만 GS에서는 날짜가 아닌 다른 기준을 사용하므로 69:41:00과 같은 기간은 1/1/1900으로 해석됩니다. 21 : 41 일이 정확하지 않습니다. 그래서 당신은 당신은 당신이 원하는 경우 날짜를 조정하여 구글 스크립트에서 작동 할 수

=text(int(A1),ʺ#0\d ʺ)&text(mod(A1,1),ʺHH\h MM\mʺ) 

이 같은 일 (정수) 및 시간 + 분 (하루 분수)로 그것을 무너 뜨리는 것이다 - 최대 1 개월 동안 OK를해야합니다.

날짜를 2로 추가하는 이유는 03:21:00 (하루 미만)과 같은 시간을 날짜로 간주하기 때문에 1899 년 12 월 30 일입니다. 그래서 저는 그것을 1900 년 1 월 1 일로 만들기 위해 2를 더합니다. 그러나 이제 날짜의 일 부분은 1이고 나는 0이되기를 원합니다. 그래서 오늘부터 1을 더 뺍니다.

이 이상한 동작은 아마 다른 방법으로 작업하고 밀리 세컨드 단위로 작업하는 것이 좋지만 원래 코드를 만들 수있는 방법이 있는지 알고 싶었습니다. 00 엑셀 : 41 :

/** 
* Format Duration to Days,Hours,Minutes 
* 
* @param {duration} input value. 
* @return Days,Hours,Minutes. 
* @customfunction 
*/ 
function FormatDuration(duration) { 
    // Add 2 days to the date 
    var date=new Date(duration.setDate(duration.getDate()+2)); 
    Logger.log(date.getDate()); 
    var hours = duration.getHours(); 
    // Take 1 off the day part of the date 
    var days = date.getDate()-1; 
    var mins = duration.getMinutes(); 

    // Convert the result to a number to use in calculations 
    var result = days + 'd ' + hours + ' h '+ mins+' min'; 
    return result; 
} 
+0

이런 종류의 작품. '61 : 44 : 00 '은'2d 13 h 38 min '입니다. 다른 값을 시도했는데 분이 항상 6 분이 줄었습니다. 왜 그런가? 또한, '(duration.getDate() + 2)'및 'date.getDate() - 1'의 목적을 설명 할 수 있습니까? – Scar

+0

답변을 수락 해 주셔서 감사합니다. 흠, 나는 분과 함께 문제가되지 않는다. 어쨌든, 내 대답에 +2와 -1에 대한 설명을 추가 할 것입니다. –

1
function(durations){ 
    var timeArr = durations.split(':'); //["69","41","00"] 
    //your code 
} 

getHours 개체 Date하는 방법이다.

var t = new Date; 
t.getHours(); 
+0

시간은 69 월에 대한 문자열 값 '1900년 1월 1일 그리니치 표준시 13시 38분 17초 + 0800 (HKT)를'준다. 셀에 표시된 값을 가져올 수 없습니까? – Scar

1

Date 개체에서 24 시간 이상을 어떻게 나올 것으로 예상합니까? Duration으로 기대하는 것과 같지 않습니다. 날짜는 캘린더의 특정 시점에 대한 것이므로 대부분의 경우 23:59:59를 얻게됩니다. 다음과 같이 date2 - date1 = milliseconds diff를 가져와 작업 할 수 있습니다.

function FormatDuration(date1, date2) { 
 
    var milliseconds = date2 - date1; 
 
    var mins = Math.floor((milliseconds/(1000*60)) % 60); 
 
    var hours = Math.floor((milliseconds/(1000*60*60)) % 24); 
 
    var days = Math.floor(milliseconds/(1000*60*60*24)); 
 

 
    var result = days + ' d ' + hours + ' h '+ mins + ' min'; 
 
    console.log(result); 
 
} 
 

 
FormatDuration(new Date(2000, 5, 1, 5, 13, 0, 0), 
 
      new Date(2000, 5, 2, 15, 31, 0, 0))

당신은 자세한 내용 here

관련 문제