Data di Excel con timestamp Unix


85

Qualcuno sa come convertire una data di Excel in un timestamp Unix corretto?


Cosa intendi per "data excel"? Intendi il testo formattato come una stringa data-ora leggibile come "11/09/2009 3:23:24 PM"?
Matt Ball

4
Non dimenticare che il 19 gennaio 2038 Unix Time Stamp cesserà di funzionare a causa di un overflow di 32 bit. Prima di questo momento milioni di applicazioni dovranno adottare una nuova convenzione per i timestamp o essere migrate su sistemi a 64 bit che faranno guadagnare al timestamp un "po" più tempo.

13
più come 32 bit più tempo.
user606723

Risposte:


107

Nessuno di questi ha funzionato per me ... quando ho convertito il timestamp sono passati 4 anni.

Funzionava perfettamente: =(A2-DATE(1970,1,1))*86400

Il merito va a: Filip Czaja http://fczaja.blogspot.ca

Post originale: http://fczaja.blogspot.ca/2011/06/convert-excel-date-into-timestamp.html


6
Non dimenticare il tuo fuso orario (a meno che tu non sia in UTC e non osservi l'ora legale). L'epoca di UNIX è indipendente dal fuso orario, mentre i fogli di calcolo non lo sono. Ecco una guida con esempi.
Adam Katz

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

ora corrente per CDT (ora legale centrale):=(NOW()-DATE(1970,1,1))*86400 + 5*3600
hBrent

Le versioni moderne di Excel si lamenteranno della formula sopra a meno che non si sostituiscano le virgole con punti e virgola:(1970;1;1)
Jose Luis Blanco

1
@tonygil Funzionerà se le celle che stai prendendo di mira sono effettivamente date in Excel. Se è un testo che dovrebbe rappresentare una data, tutte le scommesse sono annullate.
Casey

76

Windows e 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

Per riferimento:

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 su Mac sembra funzionare bene con la versione "Windows" di queste formule. Le versioni "Mac" sono lontane.
radicand

1
Penso che tu abbia invertito i timestamp excel e unix in quelle formule. Il timestamp Unix è un numero di secondi, quindi deve essere diviso per 86400, piuttosto che il timestamp Excel, che è ciò che dicono le formule. Vedi la risposta di @ radicand.
Mike Houston

Grazie per i commenti, l'ho testato su Mac Excel 2011 e sembra che siano gli stessi della versione Windows.
Jeff Wu

C'è un modo per trasformare un timestamp unix in millisecondi in datetime, preservando i millisecondi?
Lorenzo Belli

dice l'uomo su stackoverflow. si, che ne dici dei secondi intercalari, professore.
catanfetamina

11

Se assumiamo che la data in Excel sia nella cella A1 formattata come Data e il timestamp Unix dovrebbe essere in una cella A2 formattata come numero, la formula in A2 dovrebbe essere:

= (A1 * 86400) - 2209075200

dove:

86400 è il numero di secondi nel giorno 2209075200 è il numero di secondi tra 1900-01-01 e 1970-01-01 che sono le date di base per i timestamp di Excel e Unix.

Quanto sopra è vero per Windows. Su Mac la data di base in Excel è 1904-01-01 e il numero dei secondi deve essere corretto in: 2082844800


Almeno non funziona esattamente su Windows. È spento da 19 ore.
LLBBL

4
Quindi dovrebbe essere questo: = (A1 * 86400) - 2209143600
LLBBL

2
La base della data predefinita di Mac Excel è 1904 mentre in Windows Excel è 1900, ma puoi cambiare la base della data in Mac Excel deselezionando "usa sistema data 1904" in preferenze / calcolo, quindi funziona come Windows Excel.
Cloudranger

7

Ecco una mappatura di riferimento, assumendo UTC per sistemi di fogli di calcolo come 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" è il 1899/12/31; vedere la sezione Bug di seguito. Excel 2011 per Mac (e versioni precedenti) utilizza il sistema di data 1904 .

 

Poiché utilizzo spesso awkper elaborare CSV e contenuto delimitato da spazi, ho sviluppato un modo per convertire l'epoca UNIX in un formato di data Excel appropriato per fuso orario / DST :

Ho usato echoper questo esempio, ma puoi reindirizzare un file in cui la prima colonna (per la prima cella in formato .csv, chiamala come awk -F,) è un'epoca UNIX. Modifica $1per rappresentare il numero di colonna / cella desiderato o utilizza invece una variabile.

Questo fa una chiamata di sistema a date. Se si dispone della versione GNU in modo affidabile, è possibile rimuovere il 2>/dev/null || date … +%%ze il secondo , $1. Dato quanto è comune GNU, non consiglierei di assumere la versione di BSD.

La getlinelegge il fuso orario in uscita dal date +%zin tz, che viene poi tradotto in hours. Il formato sarà come -0700( PDT ) o +0530( IST ), quindi la prima sottostringa estratta è 07o 05, la seconda è 00o 30(quindi divisa per 60 per essere espressa in ore), e il terzo uso di tzvede se il nostro offset è negativo e altera hoursse necessario.

La formula data in tutte le altre risposte in questa pagina viene utilizzata per impostare excel, con l'aggiunta della regolazione del fuso orario in base all'ora legale come hours/24.

Se utilizzi una versione precedente di Excel per Mac, dovrai utilizzarla 24107al posto di 25569(vedi la mappatura sopra).

Per convertire qualsiasi tempo arbitrario non d'epoca in tempi compatibili con Excel con data GNU:

Questo è fondamentalmente lo stesso codice, ma date -dnon ha più un'epoca @per rappresentare unix (data la capacità del parser di stringhe, in realtà sono sorpreso che @sia obbligatorio; quale altro formato di data ha 9-10 cifre?) E ora viene chiesto per due uscite: l'epoca e l'offset del fuso orario. È quindi possibile utilizzare ad esempio @1234567890come input.

Bug

Lotus 1-2-3 (il software del foglio di calcolo originale) considerava intenzionalmente il 1900 come un anno bisestile nonostante il fatto che non lo fosse (questo riduceva la base di codice in un momento in cui ogni byte contava). Microsoft Excel ha mantenuto questo bug per la compatibilità, saltando il giorno 60 (il 1900/02/29 fittizio), mantenendo la mappatura di Lotus 1-2-3 dal giorno 59 al 1900/02/28. LibreOffice ha invece assegnato il giorno 60 al 1900/02/28 e ha spostato indietro di uno tutti i giorni precedenti.

Qualsiasi data prima del 1900/03/01 potrebbe essere fino a un giorno libero:

Excel non riconosce le date negative e ha una definizione speciale dello zero di gennaio (1899/12/31) per il giorno zero. Internamente, Excel gestisce effettivamente le date negative (dopotutto sono solo numeri), ma le visualizza come numeri poiché non sa come visualizzarle come date (né può convertire le date più vecchie in numeri negativi). Il 29 febbraio 1900, un giorno che non è mai accaduto, viene riconosciuto da Excel ma non da LibreOffice.


4

Poiché le mie modifiche a quanto sopra sono state rifiutate (qualcuno di voi ha davvero provato?), Ecco di cosa avete veramente bisogno per farlo funzionare:

Windows (e Mac Office 2011+):

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

MAC OS X (precedente a Office 2011):

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

2

Apparentemente sei fuori di un giorno, esattamente 86400 secondi. Usa il numero 2209161600 Non il numero 2209075200 Se cerchi i due numeri su Google, troverai supporto per quanto sopra. Ho provato la tua formula ma arrivava sempre un giorno diverso dal mio server. Non è ovvio dal timestamp unix a meno che non pensi in unix invece che in tempo umano ;-) ma se controlli due volte vedrai che potrebbe essere corretto.


Ciò è corretto, poiché Excel calcola il primo anno come anno bisestile anche se non lo è.
ANisus

Posso confermare che il numero magico è effettivamente 2209161600, essendo 1970-01-01 - 1900-01-01 + 1 giorno * 86400. Se inserisci 1900-01-01 in Excel e salvi come formato sylk e guardi il file in un editor di testo vedrai che salva quella data come 1 invece di zero come dovrebbe, motivo per cui devi aggiungere 1 giorno
Cloudranger

1

Avevo un vecchio database Excel con date "leggibili dall'uomo", come 2010.03.28 20:12:30 Queste date erano in UTC + 1 (CET) e dovevo convertirlo in tempo epocale.

Ho usato la formula = (A4-DATE (1970; 1; 1)) * 86400-3600 per convertire le date in tempo dell'epoca dalla colonna A ai valori della colonna B. Controlla la differenza di fuso orario e calcola i calcoli. 1 ora è 3600 secondi.

L'unica cosa per cui scrivo qui una risposta, puoi vedere che questo argomento ha più di 5 anni è che uso le nuove versioni di Excel e anche i post rossi in questo argomento, ma non sono corretti. La DATA (1970; 1; 1). Qui il 1970 e il gennaio vanno separati; e non con

Se stai riscontrando anche questo problema, spero che ti sia d'aiuto. Buona giornata :)


0

Nessuna delle risposte attuali ha funzionato per me perché i miei dati erano in questo formato dal lato unix:

02-02-2016 19:21:42 UTC

Avevo bisogno di convertirlo in Epoch per consentire il riferimento ad altri dati che avevano timestamp epoch.

  1. Crea una nuova colonna per la parte della data e analizza con questa formula

    =DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4)) 
    
  2. Come altri Grendler hanno già affermato qui, crea un'altra colonna

    =(B2-DATE(1970,1,1))*86400 
    
  3. Crea un'altra colonna sommando solo il tempo per ottenere il totale dei secondi:

    =(VALUE(MID(A2,12,2))*60*60+VALUE(MID(A2,15,2))*60+VALUE(MID(A2,18,2)))
    
  4. Crea un'ultima colonna che aggiunge solo le ultime due colonne insieme:

    =C2+D2
    

0

Ecco la mia risposta definitiva a questo.

Apparentemente anche il new Date(year, month, day)costruttore di javascript non tiene conto dei secondi intercalari.

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

Per compensare l' ora legale (a partire dall'ultima domenica di marzo fino all'ultima domenica di ottobre) ho dovuto utilizzare la seguente formula:

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

Spiegazione rapida:

Se la data ["A2"] è compresa tra l'ultima domenica di marzo e l'ultima domenica di ottobre [terza e quarta riga di codice], sottraerò un'ora [-TIME (1; 0; 0)] alla data.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.