如何获取 google 工作表中小时数超过 24 的持续时间的天数?

How do I get the number of days for a duration where the number of hours exceeds 24 in google sheets?

我正在使用 google 工作表,其中持续时间值为 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 21 小时 44 分钟,但我得到的是 0d 21 小时 35 分钟。我是不是做错了什么?

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

getHours 是对象 Date.

的一个方法
var t = new Date;
t.getHours();

您如何期望从 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

我正要补充,你为什么不使用自定义格式

ʺ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 日!所以我给它加 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;
}