2017-03-07 4 views
1

Ich verwende Google-Tabellen, wo es eine Dauer von 69:41:00 gibt, wo es 69 Stunden, 41 Minuten, 0 Sekunden ist. Es scheint keine Funktion zu geben, diese in Tage, Stunden und Minuten umzuwandeln, also habe ich etwas gesucht und einige hatten eine benutzerdefinierte Funktion vorgeschlagen. Ich bin mir nicht sicher, wie es genau funktioniert, aber ich habe einige Änderungen vom Original vorgenommen, um zu passen, was ich brauchte. Der folgende Code:Wie erhalte ich die Anzahl der Tage für eine Dauer, in der die Anzahl der Stunden in Google Tabellen 24 Stunden überschreitet?

/** 
 
* 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; 
 
}

Das Ergebnis sollte 44 2d 21h min sein, sondern ich bekam 0T 21 h 35 min. Mache ich hier etwas falsch?

Antwort

1

Ich wollte hinzufügen, warum Sie nicht nur ein Format benutzerdefinierte Verwendung von

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

Dies funktioniert gut in Excel, aber nicht in GS, weil es eine andere Basis für Daten verwendet, so würde Dauer wie 69:41:00 als 1/1/1900 21 interpretiert: 41 und die Tage sind nicht korrekt. So müssten Sie brechen sie in Tage (ganze Zahlen) und Stunden + Minuten (Fraktionen von einem Tag) wie folgt

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

Sie können es in Google Scripts funktioniert, wenn Sie wollen, indem Sie das Datum eingestellt - sollte für eine Dauer von bis zu einem Monat funktionieren.

Der Grund für das Hinzufügen von 2 zum Datum ist, dass eine Zeit wie 03:21:00 (weniger als ein Tag) als Datum gesehen wird - nämlich der 30. Dezember 1899! Also füge ich 2 hinzu, um es zum 1. Januar 1900 zu machen. Aber jetzt ist der Tag Teil des Datums 1 und ich möchte, dass es Null ist. Also muss ich 1 vom Tag weiter abziehen.

Dieses seltsame Verhalten ist wahrscheinlich, warum es ratsam ist, es anders zu machen und in Millisekunden zu arbeiten, aber ich war nur interessiert zu sehen, ob es eine Möglichkeit gab, den ursprünglichen Code zu arbeiten.

/** 
* 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

Diese Art von Arbeiten. Ich habe '2d 13h 38 min' für '61: 44: 00 '. Ich versuchte für andere Werte und die Minuten scheinen immer 6 Minuten weniger zu sein. Irgendeine Idee warum? Könnten Sie auch erklären, was der Zweck von '(duration.getDate() + 2)' und 'date.getDate() - 1' dafür ist? – Scar

+0

Danke für die Annahme der Antwort. Hm, ich habe kein Problem mit den Minuten. Wie auch immer, werde eine Erklärung von +2 und -1 zu meiner Antwort hinzufügen. –

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

getHours ist ein Verfahren zum Objekt Date.

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

Die Dauer gibt String-Wert von Mon 'Jan 01 1900 13:38:17 GMT + 0800 (HKT)' für '69: 41: 00' in Excel. Ich kann den Wert nicht in der Zelle anzeigen lassen. – Scar

1

Wie wollen Sie mehr als 24 Stunden von einem Date Objekt erhalten erwarten? Es ist nicht das Gleiche wie das, was Sie als Dauer erwarten. Datum ist für Zeitpunkte im Kalender, also höchstens 23:59:59 eines beliebigen Tages. Sie können date2 - date1 = milliseconds diff erhalten und daran arbeiten, wie folgt;

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))

Sie können weitere Informationen finden here

Verwandte Themen