Konvertiert Google Tabellendatum in ein JS Date Objekt?

8

Ich bin hier im Kreis herumgegangen ... Ich habe eine Tabelle, die zwei Daten enthält, und ich muss die Anzahl der verstrichenen Jahre zwischen den beiden herausfinden (dh das Alter einer Person zu einem bestimmten Datum) ; Dies ist ein Ersatz für DATEDIF von Excel.

Der erste Schritt besteht darin, Googles Seriennummer in ein JS Date-Objekt zu konvertieren, aber es scheint kein Date-Konstruktor zu sein, der dies tut. Irgendwelche Ideen?

Danke.

    
EML 16.01.2013, 16:28
quelle

5 Antworten

7

Ich weiß, dass Sie mit Ihrer Lösung zufrieden sind, aber ich möchte nur meine Beobachtungen dazu hinzufügen, wie Google Apps Script mit "Daten" umgeht, die entweder in einer benutzerdefinierten Funktion übergeben oder mit getValue () aus einer Zelle abgerufen werden. .

Als Faustregel gilt, dass wenn Google Tabellen (die Tabellenkalkulationsanwendung) einen Wert formatiert als Datum bereitstellt (entweder durch automatische Nötigung oder durch den Benutzer, der das Format festlegt), Google Apps Script Halten Sie diesen Wert automatisch als Datumsobjekt.

ZB:

%Vor%

Wenn Sie 1/1/13 in A1 eingeben und in einer anderen Zelle =returnDate(A1) aufrufen, gibt es dasselbe Datum zurück (als ob Sie einfach return value; im Code hätten). Beachten Sie jedoch, was passiert, wenn Sie A1 als "Normal" formatieren (konvertieren Sie es in einen numerischen Wert). Hier wird die "Sheets-Seriennummer" (Anzahl der Tage ab dem 30.12.1899) von Google Apps Script in ein Datumsobjekt konvertiert, in GAS wird sie jedoch ab Mitternacht des 1.1.1970 als die Anzahl der Millisekunden "betrachtet" . Sie erhalten also möglicherweise unerwartete Ergebnisse, wenn Sie numerische Werte übergeben, von denen Sie glauben, dass sie für ein Datum repräsentativ sind.

Vergleichen Sie auch:

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

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

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

=returnDate("1/1/13")

=returnDate("1/1/2013")

Die letzten beiden "funktionieren", weil new Date() das Datumsobjekt erfolgreich aus einer gültigen Zeichenfolge erstellt. Beachten Sie jedoch, dass Sheets automatisch das aktuelle Jahrhundert verwendet, während GAS ein zweistelliges Jahr bis 1900 verwendet.

Also IMO, wenn Sie wollen, dass es sich genauso verhält wie in Excel (das heißt, einen numerischen Wert als Seriennummer für ein Datum ansehen), müssten Sie zuerst testen, ob der übergebene Parameter ein Datumsobjekt ist (oder "gültige" Textzeichenfolge), und wenn nicht, wandeln Sie sie mathematisch von "Tage vom 30/12/1899" in "Millisekunden vom 1.1.1970" um und dann new Date() it.

Entschuldigung für die langatmige Post.

    
AdamL 16.01.2013 20:36
quelle
6

So konvertieren Sie ein Google-Tabellendatum in ein JavaScript-Datum:

%Vor%

So konvertieren Sie ein Javascript-Datum in ein Google-Tabellendatum:

%Vor%     
user2197265 14.01.2017 22:41
quelle
2

Das habe ich gemacht:

%Vor%

Das mag ein bisschen schmutzig erscheinen, aber das ist die einzige Lösung, die ich für jetzt gefunden habe

    
mou 25.10.2016 13:12
quelle
1

Unter "Seriennummer" vermute ich, dass Sie über eine Unix-Zeit in Sekunden oder Millisekunden aus der Epoche sprechen. Sie können einfach das Standard-JavaScript-Date-Objekt verwenden:

%Vor%

Google ist dein Freund von dort. Hier sind einige Referenzen, um Sie zu starten:

Javascript erlaubt Ihnen, einfache Subtraktion mit zwei Daten zu machen, die Ihnen den Zeitunterschied in ms zurückgeben.

%Vor%

Das sollte alles sein, was Sie brauchen, um es herauszufinden, also überlasse ich die Jahreberechnung als Übung für den Leser.

    
Daniel 16.01.2013 17:12
quelle
1

Nach einigen weiteren Experimenten stellte sich heraus, dass es einfach funktioniert, was eine kleine Überraschung war. new Date(cell) scheint die Seriennummer intern in eine Zeichenfolge umzuwandeln, die ausreicht, um das Datumsobjekt zu erstellen. Volle Antwort:

%Vor%     
EML 16.01.2013 17:12
quelle