1

我正在使用 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 21h 44 min 但我得到的是 0d 21 h 35 min。我在这里做错了吗?

4

3 回答 3

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

getHours是对象的方法Date

var t = new Date;
t.getHours();
于 2017-03-07T03:22:55.323 回答
1

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

您可以在此处找到更多详细信息

于 2017-03-07T03:39:51.243 回答
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 Scripts 中工作 - 应该可以正常工作长达 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;
}
于 2017-03-07T11:21:57.163 回答