2009-04-29 17 views
80

Sto scrivendo un file CSV. Ho bisogno di scrivere timestamp che siano precisi almeno al secondo e preferibilmente al millisecondo. Qual è il formato migliore per i timestamp in un file CSV in modo che possano essere analizzati in modo preciso e inequivocabile da Excel con un intervento minimo da parte dell'utente?Formato timestamp migliore per CSV/Excel?

+0

quale lingua stai usando per creare l'uscita ? –

risposta

70

Per la seconda precisione, aaaa-MM-gg HH: mm: ss dovrebbe fare il trucco.

Credo che Excel non funzioni molto bene con frazioni di secondo (li perde durante l'interazione con l'oggetto COM IIRC - cercherò di trovare un riferimento e pubblicarlo qui).

+0

Sì, sono d'accordo con te e Fredrik. Se riesci a trovare quei riferimenti, sarei certamente grato. Grazie! –

+11

Qualche idea su come mostrare il fuso orario? – nickf

+8

Per chiunque usi ['strftime'] di Ruby (http://apidock.com/ruby/DateTime/strftime), la stringa di argomento equivalente è' "% Y-% m-% d% H:% M:% S" ' –

2

Credo che se si fosse utilizzato il tipo di dati double, il ricalcolo in Excel funzionerebbe perfettamente.

+0

Ho appena provato e funziona davvero bene. Devo solo dire a Excell che il formato di quella particolare colonna è Data/Ora. Non rileverà questo automaticamente dal CSV in quanto ovviamente non descrive i dati –

0

Direi che lo ISO-format è una buona idea. (Wikipedia article, anche con informazioni sull'ora)

+0

concordato; questa sembra essere la migliore scommessa. –

+1

(downvote, in realtà no, excel non riconosce quel formato) – Doug

+1

@Doug Ho appena eseguito un test per verificarlo: funziona bene in Office 2010, edizione inglese, provato con entrambe le mie impostazioni locali (svedese, che capita di usare il formato ISO per le date e l'inglese americano). Fuori di interesse: in quale ambiente ha fallito per te? Non sono minimamente sorpreso dal fatto che funzioni per alcuni e non riesca per alcuni: Excel non è davvero una meraviglia di coerenza nella mia esperienza ... –

11

Il precedente suggerimento di utilizzare "aaaa-MM-gg HH: mm: ss" va bene, anche se credo che Excel abbia una risoluzione temporale molto migliore di quella. Trovo piuttosto credibile lo this post (segui il thread e vedrai un sacco di aritmetica e sperimenti con Excel), e se è corretto, avrai i tuoi millisecondi. Alla fine puoi virare sui posti decimali, ad esempio "aaaa-mm-gg hh: mm: ss.000".

Si dovrebbe essere consapevoli del fatto che Excel potrebbe non necessariamente formattare i dati (senza intervento umano) in modo tale da vedere tutta questa precisione. Sul mio computer al lavoro, quando ho creato un CSV con i dati "yyyy-mm-gg hh: mm: ss.000" (a mano usando Blocco note), ottengo "mm: ss.0" nella cella e "m/g/aaaa   hh: mm: ss AM/PM "nella barra della formula.

Per informazioni massime [1] trasportate nelle celle senza intervento umano, è possibile suddividere il timestamp in una porzione di data e una porzione di tempo, con la porzione di tempo solo per il secondo. Mi sembra che Excel voglia darti al massimo tre "livelli" visibili (dove le frazioni di secondo sono il loro livello) in ogni cella, e tu vuoi sette: anni, mesi, giorni, ore, minuti, secondi, e frazioni di secondo.

Oppure, se non si desidera che il timestamp sia leggibile dall'uomo ma si desidera che sia il più preciso possibile, si potrebbe preferire semplicemente memorizzare un numero grande (internamente, Excel utilizza solo il numero di giorni , compresi i giorni frazionari, da una data di "epoca").


[1] Cioè, informazioni numeriche. Se vuoi vedere quante più informazioni possibili, ma non ti preoccupare di fare calcoli con esso, potresti creare un formato che Excel sicuramente analizzerà come una stringa, e quindi lascerà da solo; per esempio. "Yyyymmdd.hhmmss.000".

9

Il formato "aaaa-MM-gg hh: mm: ss.000" non funziona in tutte le lingue. Per alcuni (almeno il danese) "yyyy-MM-gg hh: mm: ss, 000" funzionerà meglio.

+0

Stranamente Excel 2010 non rileva le date quando la parte del millisecondo è 000. Qualsiasi altro lo farà. –

1

Per quanto riguarda i fusi orari. Devo memorizzare l'offset UTC come secondi da UTC in quel modo le formule in Excel/OpenOffice possono eventualmente localizzare i dati. Ho trovato questo più facile di memorizzare qualsiasi numero che ha uno 0 di fronte. -0900 non è stato analizzato bene in nessun sistema di fogli elettronici e l'importazione era quasi impossibile da addestrare alle persone.

1

Passare alle impostazioni della lingua nel Pannello di controllo, quindi Opzioni di formattazione, selezionare un'impostazione internazionale e visualizzare il formato di data effettivo per le impostazioni internazionali selezionate utilizzate da Windows per impostazione predefinita. Sì, quel formato di timestamp è sensibile alle impostazioni internazionali. Excel utilizza tali formati durante l'analisi di CSV.

Inoltre, se le impostazioni internazionali utilizzano caratteri oltre ASCII, sarà necessario emettere CSV nella codepage "ANSI" di Windows pre-Unicode corrispondente, ad es. CP1251. Excel non accetterà UTF-8.

0

Prova MM/gg/aaaa hh: mm: ss un formato.

Codice Java per creare il file XML. .

xmlResponse.append ("MyDate>") append (this.formatDate (resultSet.getTimestamp ("data"), "MM/gg/aaaa hh: mm: ss a")). aggiungere("");

"hh aaaa-mm-gg: mm: ss.000"
public String formatDate(Date date, String format) 
{ 
    String dateString = ""; 
    if(null != date) 
    { 
     SimpleDateFormat dateFormat = new SimpleDateFormat(format); 
     dateString = dateFormat.format(date); 
    } 
    return dateString; 
} 
1

formato non funziona in tutti i locali. Per alcuni (almeno il danese) "aaaa-mm-gg hh: mm: ss, 000" funzionerà meglio.

come risposto dall'utente662894.

Desidero aggiungere: Non tentare di ottenere i microsecondi, ad esempio, dal tipo di dati datetime2 di SQL Server: Excel non può gestire più di 3 secondi frazionari (vale a dire millisecondi).

"hh aaaa-mm-gg: mm: ss.000000" Così non funziona, e quando Excel si alimenta questo tipo di corda (dal file CSV), esso deve svolgere arrotondamento piuttosto che troncamento.

Questo può andare bene se non quando le cose microsecondo di precisione, nel qual caso si sono meglio per non far scattare un riconoscimento automatico tipo di dati, ma solo a mantenere la stringa come stringa ...

Problemi correlati