Convertire la data del foglio di lavoro Google in un object Date JS?

Ho fatto un giro in tondo su questo … ho un foglio di calcolo che contiene due date, e ho bisogno di trovare il numero di anni trascorsi tra i due (cioè l’età di qualcuno in una certa data, questo è una sostituzione per DATEDIF di Excel).

Il primo passo è convertire il numero di serie di Google in un object Date JS, ma non sembra che il costruttore di Date lo faccia. Qualche idea?

Grazie.

So che sei soddisfatto della tua soluzione così com’è, ma volevo solo aggiungere le mie osservazioni su come Google Apps Script tratta le “date”, passate in una funzione personalizzata o recuperate da una cella con getValue ().

La mia regola empirica è che se Sheets (l’applicazione per fogli di calcolo) fornisce un valore formattato come data (tramite la coercizione automatica o l’impostazione del formato dell’utente), lo script di Google Apps manterrà automaticamente questo valore come object di data.

Per esempio:

function returnDate(value) { return new Date(value); } 

Se si immette 1/1/13 in A1 e in un’altra cella si invoca =returnDate(A1) , verrà restituita la stessa data (come se fosse semplicemente il return value; nel codice). Tuttavia, guarda cosa succede quando formatthi A1 come “Normale” (convertilo in un valore numerico). Qui, il “Numero di serie di fogli” (numero di giorni dal 30/12/1899) viene convertito in un object data da Google Apps Script, ma in GAS viene “considerato” come il numero di millisecondi dalla mezzanotte 1/1/1970 . Quindi potresti ottenere risultati imprevisti se passi valori numerici che ritieni rappresentativi di una data.

Confronta anche:

=returnDate(DATE(2013;1;1))

=returnDate(VALUE("1/1/13"))

=returnDate(DATEVALUE("1/1/13"))

=returnDate("1/1/13")

=returnDate("1/1/2013")

Gli ultimi due “funzionano”, poiché la new Date() crea correttamente l’object data da una stringa valida, ma nota che Fogli automaticamente costringe al secolo corrente, mentre il GAS costringe un anno a due cifre al 1900.

Quindi IMO se si desidera che si comporti esattamente come in Excel (ovvero, “considera” un valore numerico come numero seriale per una data), sarà necessario prima verificare se il parametro passato è un object data (o ” valido “stringa di testo”, e se non lo è, convertilo matematicamente da “giorni dal 30/12/1899” a “millisecondi da 1/1/1970”, e quindi new Date() .

Ci scusiamo per il post prolisso.

Per convertire una data di un foglio di lavoro Google in una data javascript:

 var JSdate = Date.parse(Cell.getValue()) 

Per convertire una data javascript in una data di un foglio di lavoro Google:

 function GoogleDate( JSdate ) { var D = new Date(JSdate) ; var Null = new Date(Date.UTC(1899,11,30,0,0,0,0)) ; // the starting value for Google return ((D.getTime() - Null.getTime())/60000 - D.getTimezoneOffset()) / 1440 ; } 

Questo è quello che ho fatto:

 function numberToDate(number){ var date = new Date(number * 24 * 60 * 60 * 1000); date.setFullYear(date.getFullYear() - 70); date.setDate(date.getDate() - 1); return (date); } 

Questo può sembrare un po ‘sporco, ma questa è l’unica soluzione che ho trovato per ora

Dopo un po ‘di sperimentazioni, si è scoperto che funziona, ed è stata una sorpresa. new Date(cell) sembra convertire internamente il numero seriale in una stringa che è sufficiente per creare l’object data. Risposta completa:

 function datedif(first, second, format) { var e1 = new Date(first); var e2 = new Date(second); var age = e2.getFullYear() - e1.getFullYear(); if( (e2.getMonth() < e1.getMonth()) || ((e2.getMonth() == e1.getMonth()) && (e2.getDate() < e1.getDate()))) age--; return age; } 

Per “numero di serie” suppongo che tu stia parlando di un tempo unix in secondi o millisecondi dell’epoca. Puoi semplicemente utilizzare l’object Date standard di Javascript:

 new Date(value); 

Google è tuo amico da lì. Ecco alcuni riferimenti per iniziare:

  • Riferimento alle scuole W3
  • Tutorial W3 Schools
  • Riferimento MDN

Javascript ti permette di fare una semplice sottrazione con due date, restituendoti la differenza di tempo in ms.

 var timeDiffInMS = date2 - date1; 

Questo dovrebbe essere tutto ciò che serve per capirlo, quindi lascerò il calcolo degli anni come esercizio per il lettore.

Puoi provare in questo modo:

 return new Date(1900, 0, --excelDate)