如何获取Google工作表中小时数超过24小时的天数?

时间:2017-03-07 03:10:19

标签: javascript google-sheets days hour minute

我正在使用谷歌工作表,其持续时间值为69:41:00,其中69小时41分0秒。似乎没有把它转换为天,小时和分钟的函数,所以我做了一些搜索,有些人提出了自定义函数。不知道它究竟是如何工作的,但是从原始版本做了一些改变以适应我的需要。以下代码:



/**
 * 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分钟。我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

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

getHours是对象Date的方法。

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

答案 1 :(得分:1)

您如何从Date对象获得超过24小时的时间?它与您期望的持续时间不同。日期是日历中的时间点,所以最多你得到任何一天的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

答案 2 :(得分: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ʺ)

如果您想通过调整日期,可以在Google脚本中使用它 - 在长达1个月的持续时间内正常工作。

在日期中添加2的原因是将03:21:00(不到一天)的时间视为日期 - 即1899年12月30日!所以我在1900年1月1日加上2来制作它。然而,现在日期的那一天是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;
}