Excel-Datum für Unix-Zeitstempel


84

Weiß jemand, wie man ein Excel-Datum in einen korrekten Unix-Zeitstempel konvertiert?


Was meinst du mit einem "Excel-Datum"? Meinen Sie damit Text, der als lesbare Datums- / Zeitzeichenfolge formatiert ist "11/09/2009 3:23:24 PM"?
Matt Ball

4
Vergessen Sie nicht, dass der Unix-Zeitstempel am 19. Januar 2038 aufgrund eines 32-Bit-Überlaufs nicht mehr funktioniert. Vor diesem Moment müssen Millionen von Anwendungen entweder eine neue Konvention für Zeitstempel anwenden oder auf 64-Bit-Systeme migriert werden, wodurch der Zeitstempel ein bisschen mehr Zeit erhält.

13
eher wie 32bit mehr Zeit.
user606723

Antworten:


107

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


6
Vergessen Sie nicht Ihre Zeitzone (es sei denn, Sie sind in UTC und beobachten die Sommerzeit nicht). Die UNIX-Epoche ist unabhängig von der Zeitzone, während dies bei Tabellenkalkulationen nicht der Fall ist. Hier ist eine Anleitung mit Beispielen.
Adam Katz

GMT + 8:=((A1+28800)/86400)+25569
Ivan Chau

aktuelle Zeit für CDT (zentrale Sommerzeit):=(NOW()-DATE(1970,1,1))*86400 + 5*3600
hBrent

Moderne Versionen von Excel beschweren sich über die obige Formel, es sei denn, Sie ersetzen Kommas durch Semikolons:(1970;1;1)
Jose Luis Blanco

1
@tonygil Es funktioniert, wenn die Zellen, auf die Sie abzielen, tatsächlich Daten in Excel sind. Wenn es sich um Text handelt, der ein Datum darstellen soll, sind alle Wetten ungültig.
Casey

75

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)

3
Office 2011 auf Mac scheint mit der "Windows" -Version dieser Formeln gut zu funktionieren. Die "Mac" -Versionen sind weit davon entfernt.
Radicand

1
Ich denke, Sie haben die Excel- und Unix-Zeitstempel in diesen Formeln umgekehrt. Der Unix-Zeitstempel hat eine Anzahl von Sekunden und muss daher durch 86400 geteilt werden, anstatt durch den Excel-Zeitstempel, wie in den Formeln angegeben. Siehe die Antwort von @ radicand.
Mike Houston

Vielen Dank für die Kommentare, die auf Mac Excel 2011 getestet wurden und anscheinend mit der Windows-Version identisch sind.
Jeff Wu

Gibt es eine Möglichkeit, einen Unix-Zeitstempel in Millisekunden in Datum / Uhrzeit umzuwandeln, wobei die Millisekunden erhalten bleiben?
Lorenzo Belli

sagt der Mann auf Stackoverflow. Ja, was ist mit Schaltsekunden, Professor?
Katamphetamin

11

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


Zumindest unter Windows funktioniert das nicht genau. Es ist um 19 Stunden aus.
LLBBL

4
So sollte es sein: = (A1 * 86400) - 2209143600
LLBBL

2
Die Standard-Datumsbasis von Mac Excel ist 1904, während sie in Windows Excel 1900 ist. Sie können die Datumsbasis in Mac Excel jedoch ändern, indem Sie unter Einstellungen / Berechnung das Kontrollkästchen "1904-Datumssystem verwenden" deaktivieren. Dann funktioniert es wie Windows Excel.
Cloudranger

6

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 awkzu 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 echodieses 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 … +%%zund die zweite entfernen , $1. Angesichts der Verbreitung von GNU würde ich die Annahme der BSD-Version nicht empfehlen.

Das getlineliest den von date +%zin ausgegebenen Zeitzonenversatz tz, der dann in übersetzt wird hours. Das Format ist wie -0700( PDT ) oder +0530( IST ), also ist der erste extrahierte Teilstring 07oder 05, der zweite ist 00oder 30(dann geteilt durch 60, ausgedrückt in Stunden), und die dritte Verwendung von tzsieht, ob unser Offset negativ ist und sich ändert hourswenn 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 24107anstelle 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 -dkeine @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 @1234567890als Eingabe verwenden.

Fehler

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.


3

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

  • Unix-Zeitstempel = (Excel Timestamp - 25569) * 86400
  • Excel-Zeitstempel = (Unix Timestamp / 86400) + 25569

MAC OS X (vor Office 2011):

  • Unix-Zeitstempel = (Excel Timestamp - 24107) * 86400
  • Excel-Zeitstempel = (Unix Timestamp / 86400) + 24107

2

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.


Dies ist richtig, da Excel das erste Jahr als Schaltjahr berechnet, obwohl dies nicht der Fall ist.
ANisus

Ich kann bestätigen, dass die magische Zahl tatsächlich 2209161600 ist. Dies ist 1970-01-01 - 1900-01-01 + 1 Tag * 86400. Wenn Sie 1900-01-01 in Excel eingeben und als Sylk-Format speichern und die Datei in ansehen In einem Texteditor wird dieses Datum als 1 statt als Null
gespeichert

1

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


0

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.

  1. 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)) 
    
  2. Wie andere Grendler hier bereits angegeben haben, erstellen Sie eine weitere Spalte

    =(B2-DATE(1970,1,1))*86400 
    
  3. 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)))
    
  4. Erstellen Sie eine letzte Spalte, in der nur die letzten beiden Spalten addiert werden:

    =C2+D2
    

0

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

0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.