2017-03-07 79 views
1

我正在使用谷歌表,其中有一个持续时间值为69:41:00,它是69小时41分钟0秒。似乎没有将此转换为日,小时和分钟的功能,所以我做了一些搜索,并且有人提出了自定义函数。不确定它是如何工作的,但是从原来的做了一些改变,以适应我所需要的。代码如下:如何获得谷歌表格中小时数超过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分钟,而是我得到0D 21小时35分钟。我在这里做错了什么?

回答

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个月。

将日期加2的原因是,像03:21:00(不到一天)的时间被视为日期 - 即1899年12月30日!所以我加了2来制作1900年1月1日。但是,现在日期的一部分是1,我希望它是零。所以我必须从下一天减去1。

这种奇怪的行为可能是为什么你建议以另一种方式做,并在毫秒内工作,但我只是想看看是否有办法使原代码工作。

/** 
* 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小时38分钟'。 我尝试了其他值,分钟似乎总是少了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分十七秒GMT + 0800(HKT)':41:00' 在Excel中。我无法获取单元格中显示的值? – Scar

1

你怎么能期望得到比24小时更从Date对象?它与你期望的持续时间不一样。日期是日历中的时间点,所以最多可以得到任何一天的23点59分59秒。您可以获得date2 - date1 = milliseconds差异化,并对其进行处理,如下所示;

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

相关问题