Weiß jemand, wie man ein Excel-Datum in einen korrekten Unix-Zeitstempel konvertiert?
Weiß jemand, wie man ein Excel-Datum in einen korrekten Unix-Zeitstempel konvertiert?
Antworten:
Nichts davon hat bei mir funktioniert ... als ich den Zeitstempel zurückkonvertierte, waren es 4 Jahre.
Das hat perfekt funktioniert: =(A2-DATE(1970,1,1))*86400
Gutschrift geht an: Filip Czaja http://fczaja.blogspot.ca
Ursprünglicher Beitrag: http://fczaja.blogspot.ca/2011/06/convert-excel-date-into-timestamp.html
=((A1+28800)/86400)+25569
=(NOW()-DATE(1970,1,1))*86400 + 5*3600
(1970;1;1)
Windows und Mac Excel (2011):
Unix Timestamp = (Excel Timestamp - 25569) * 86400
Excel Timestamp = (Unix Timestamp / 86400) + 25569
MAC OS X (2007):
Unix Timestamp = (Excel Timestamp - 24107) * 86400
Excel Timestamp = (Unix Timestamp / 86400) + 24107
Als Referenz:
86400 = Seconds in a day
25569 = Days between 1970/01/01 and 1900/01/01 (min date in Windows Excel)
24107 = Days between 1970/01/01 and 1904/01/02 (min date in Mac Excel 2007)
Wenn wir davon ausgehen, dass das Datum in Excel in einer A1-Zelle als Datum formatiert ist und der Unix-Zeitstempel in einer A2-Zelle als Nummer formatiert sein sollte, sollte die Formel in A2 wie folgt lauten:
= (A1 * 86400) - 2209075200
wo:
86400 ist die Anzahl der Sekunden am Tag. 2209075200 ist die Anzahl der Sekunden zwischen dem 01.01.1900 und dem 01.01.1970. Dies sind die Basisdaten für Excel- und Unix-Zeitstempel.
Dies gilt für Windows. Unter Mac ist das Basisdatum in Excel 1904-01-01 und die Sekundenzahl sollte auf 2082844800 korrigiert werden
Hier ist eine Zuordnung als Referenz, vorausgesetzt UTC für Tabellenkalkulationssysteme wie Microsoft Excel:
Unix Excel Mac Excel Human Date Human Time
Excel Epoch -2209075200 -1462 0 1900/01/00* 00:00:00 (local)
Excel ≤ 2011 Mac† -2082758400 0 1462 1904/12/31 00:00:00 (local)
Unix Epoch 0 24107 25569 1970/01/01 00:00:00 UTC
Example Below 1234567890 38395.6 39857.6 2009/02/13 23:31:30 UTC
Signed Int Max 2147483648 51886 50424 2038/01/19 03:14:08 UTC
One Second 1 0.0000115740… — 00:00:01
One Hour 3600 0.0416666666… ― 01:00:00
One Day 86400 1 1 ― 24:00:00
* "Jan Zero, 1900" ist 1899/12/31; Siehe den Bug- Abschnitt unten. † Excel 2011 für Mac (und älter) verwendet das 1904-Datumssystem .
Wie benutze ich oft awk
zu verarbeiten CSV und durch Leerzeichen getrennte Inhalt, entwickelte ich eine Art und Weise UNIX - Epoche zu konvertieren Zeitzone / DST Eine angemessene Excel Datumsformat:
echo 1234567890 |awk '{
# tries GNU date, tries BSD date on failure
cmd = sprintf("date -d@%d +%%z 2>/dev/null || date -jf %%s %d +%%z", $1, $1)
cmd |getline tz # read in time-specific offset
hours = substr(tz, 2, 2) + substr(tz, 4) / 60 # hours + minutes (hi, India)
if (tz ~ /^-/) hours *= -1 # offset direction (east/west)
excel = $1/86400 + hours/24 + 25569 # as days, plus offset
printf "%.9f\n", excel
}'
Ich habe echo
dieses Beispiel verwendet, aber Sie können eine Datei weiterleiten, in der die erste Spalte (für die erste Zelle im CSV-Format als awk -F,
) eine UNIX-Epoche ist. Ändern Sie $1
, um Ihre gewünschte Spalten- / Zellennummer darzustellen, oder verwenden Sie stattdessen eine Variable.
Dies führt einen Systemaufruf an date
. Wenn Sie die GNU-Version zuverlässig haben, können Sie die 2>/dev/null || date … +%%z
und die zweite entfernen , $1
. Angesichts der Verbreitung von GNU würde ich die Annahme der BSD-Version nicht empfehlen.
Das getline
liest den von date +%z
in ausgegebenen Zeitzonenversatz tz
, der dann in übersetzt wird hours
. Das Format ist wie -0700
( PDT ) oder +0530
( IST ), also ist der erste extrahierte Teilstring 07
oder 05
, der zweite ist 00
oder 30
(dann geteilt durch 60, ausgedrückt in Stunden), und die dritte Verwendung von tz
sieht, ob unser Offset negativ ist und sich ändert hours
wenn benötigt.
Die Formel, die in allen anderen Antworten auf dieser Seite angegeben ist, wird zum Festlegen verwendet excel
, wobei zusätzlich die Sommerzeiteinstellung für die Sommerzeit als hinzugefügt wird hours/24
.
Wenn Sie eine ältere Version von Excel für Mac verwenden, müssen Sie diese 24107
anstelle von verwenden 25569
(siehe Abbildung oben).
So konvertieren Sie beliebige Zeiten außerhalb der Epoche in Excel-freundliche Zeiten mit GNU-Datum:
echo "last thursday" |awk '{
cmd = sprintf("date -d \"%s\" +\"%%s %%z\"", $0)
cmd |getline
hours = substr($2, 2, 2) + substr($2, 4) / 60
if ($2 ~ /^-/) hours *= -1
excel = $1/86400 + hours/24 + 25569
printf "%.9f\n", excel
}'
Dies ist im Grunde der gleiche Code, aber der hat date -d
keine @
Unix-Epoche mehr (angesichts der Leistungsfähigkeit des String-Parsers bin ich tatsächlich überrascht, dass dies @
obligatorisch ist; welches andere Datumsformat hat 9-10 Ziffern?) Und es wird jetzt gefragt für zwei Ausgänge: die Epoche und den Zeitzonenversatz. Sie können daher zB @1234567890
als Eingabe verwenden.
Lotus 1-2-3 (die ursprüngliche Tabellenkalkulationssoftware) behandelte 1900 absichtlich als Schaltjahr, obwohl dies nicht der Fall war (dies reduzierte die Codebasis zu einem Zeitpunkt, an dem jedes Byte gezählt wurde). Microsoft Excel behielt diesen Fehler aus Kompatibilitätsgründen bei und übersprang Tag 60 (den fiktiven 29.02.1900) und behielt die Zuordnung von Lotus 1-2-3 von Tag 59 bis 28.02.1900 bei. LibreOffice hat stattdessen Tag 60 bis 1900/02/28 zugewiesen und alle vorherigen Tage um einen verschoben.
Jedes Datum vor dem 01.03.1900 kann bis zu einem freien Tag sein:
Day Excel LibreOffice
-1 -1 1899/12/29
0 1900/01/00* 1899/12/30
1 1900/01/01 1899/12/31
2 1900/01/02 1900/01/01
…
59 1900/02/28 1900/02/27
60 1900/02/29(!) 1900/02/28
61 1900/03/01 1900/03/01
Excel erkennt keine negativen Daten an und hat eine spezielle Definition des Zeroth vom Januar (1899/12/31) für Tag Null. Intern verarbeitet Excel zwar negative Daten (sie sind schließlich nur Zahlen), zeigt sie jedoch als Zahlen an, da es nicht weiß, wie sie als Daten angezeigt werden sollen (und ältere Daten auch nicht in negative Zahlen umwandeln kann). Der 29. Februar 1900, ein Tag, der nie passiert ist, wird von Excel erkannt, nicht jedoch von LibreOffice.
Da meine Änderungen an den oben genannten Punkten abgelehnt wurden (hat es einer von Ihnen tatsächlich versucht?), Was Sie wirklich brauchen, damit dies funktioniert:
Windows (und Mac Office 2011+):
(Excel Timestamp - 25569) * 86400
(Unix Timestamp / 86400) + 25569
MAC OS X (vor Office 2011):
(Excel Timestamp - 24107) * 86400
(Unix Timestamp / 86400) + 24107
Sie haben anscheinend einen Tag Zeit, genau 86400 Sekunden. Verwenden Sie die Nummer 2209161600 Nicht die Nummer 2209075200 Wenn Sie die beiden Nummern googeln, finden Sie Unterstützung für die oben genannten. Ich habe Ihre Formel ausprobiert, kam aber immer einen Tag anders als mein Server. Aus dem Unix-Zeitstempel ist es nicht ersichtlich, es sei denn, Sie denken in Unix statt in menschlicher Zeit ;-) Wenn Sie dies jedoch noch einmal überprüfen, werden Sie feststellen, dass dies möglicherweise korrekt ist.
Ich hatte eine alte Excel-Datenbank mit "für Menschen lesbaren" Daten, wie z. B. 2010.03.28 20:12:30 Diese Daten waren in UTC + 1 (MEZ) und mussten in die Epochenzeit konvertiert werden.
Ich habe die Formel = (A4-DATE (1970; 1; 1)) * 86400-3600 verwendet, um die Daten in die Epochenzeit von der A-Spalte in die B-Spaltenwerte umzuwandeln. Überprüfen Sie Ihren Zeitzonenversatz und rechnen Sie damit. 1 Stunde ist 3600 Sekunden.
Das einzige, warum ich hier eine Antwort schreibe, können Sie sehen, dass dieses Thema älter als 5 Jahre ist, dass ich die neuen Excel-Versionen und auch rote Beiträge in diesem Thema verwende, aber sie sind falsch. Das Datum (1970; 1; 1). Hier müssen 1970 und Januar getrennt werden; und nicht mit,
Wenn dieses Problem ebenfalls auftritt, hoffen Sie, dass es Ihnen hilft. Einen schönen Tag noch :)
Keine der aktuellen Antworten hat bei mir funktioniert, da meine Daten von der Unix-Seite in diesem Format vorliegen:
2016-02-02 19:21:42 UTC
Ich musste dies in Epoche konvertieren, um auf andere Daten mit Epochenzeitstempeln verweisen zu können.
Erstellen Sie eine neue Spalte für den Datumsteil und analysieren Sie mit dieser Formel
=DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4))
Wie andere Grendler hier bereits angegeben haben, erstellen Sie eine weitere Spalte
=(B2-DATE(1970,1,1))*86400
Erstellen Sie eine weitere Spalte, in der nur die Zeit addiert wird, um die Gesamtsekunde zu erhalten:
=(VALUE(MID(A2,12,2))*60*60+VALUE(MID(A2,15,2))*60+VALUE(MID(A2,18,2)))
Erstellen Sie eine letzte Spalte, in der nur die letzten beiden Spalten addiert werden:
=C2+D2
Hier ist meine ultimative Antwort darauf.
Anscheinend new Date(year, month, day)
berücksichtigt der Konstruktor von Javascript auch keine Schaltsekunden.
// Parses an Excel Date ("serial") into a
// corresponding javascript Date in UTC+0 timezone.
//
// Doesn't account for leap seconds.
// Therefore is not 100% correct.
// But will do, I guess, since we're
// not doing rocket science here.
//
// https://www.pcworld.com/article/3063622/software/mastering-excel-date-time-serial-numbers-networkdays-datevalue-and-more.html
// "If you need to calculate dates in your spreadsheets,
// Excel uses its own unique system, which it calls Serial Numbers".
//
lib.parseExcelDate = function (excelSerialDate) {
// "Excel serial date" is just
// the count of days since `01/01/1900`
// (seems that it may be even fractional).
//
// The count of days elapsed
// since `01/01/1900` (Excel epoch)
// till `01/01/1970` (Unix epoch).
// Accounts for leap years
// (19 of them, yielding 19 extra days).
const daysBeforeUnixEpoch = 70 * 365 + 19;
// An hour, approximately, because a minute
// may be longer than 60 seconds, see "leap seconds".
const hour = 60 * 60 * 1000;
// "In the 1900 system, the serial number 1 represents January 1, 1900, 12:00:00 a.m.
// while the number 0 represents the fictitious date January 0, 1900".
// These extra 12 hours are a hack to make things
// a little bit less weird when rendering parsed dates.
// E.g. if a date `Jan 1st, 2017` gets parsed as
// `Jan 1st, 2017, 00:00 UTC` then when displayed in the US
// it would show up as `Dec 31st, 2016, 19:00 UTC-05` (Austin, Texas).
// That would be weird for a website user.
// Therefore this extra 12-hour padding is added
// to compensate for the most weird cases like this
// (doesn't solve all of them, but most of them).
// And if you ask what about -12/+12 border then
// the answer is people there are already accustomed
// to the weird time behaviour when their neighbours
// may have completely different date than they do.
//
// `Math.round()` rounds all time fractions
// smaller than a millisecond (e.g. nanoseconds)
// but it's unlikely that an Excel serial date
// is gonna contain even seconds.
//
return new Date(Math.round((excelSerialDate - daysBeforeUnixEpoch) * 24 * hour) + 12 * hour);
};
Um die Sommerzeit auszugleichen (beginnend am letzten Sonntag im März bis zum letzten Sonntag im Oktober), musste ich die folgende Formel verwenden:
=IF(
AND(
A2>=EOMONTH(DATE(YEAR(A2);3;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);3;1);0);11);7);
A2<=EOMONTH(DATE(YEAR(A2);10;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);10;1);0);11);7)
);
(A2-DATE(1970;1;1)-TIME(1;0;0))*24*60*60*1000;
(A2-DATE(1970;1;1))*24*60*60*1000
)
Schnelle Erklärung:
Wenn das Datum ["A2"] zwischen dem letzten Sonntag im März und dem letzten Sonntag im Oktober liegt [dritte und vierte Codezeile], subtrahiere ich eine Stunde [-TIME (1; 0; 0)] vom Datum.
"11/09/2009 3:23:24 PM"
?