Domanda

Sto scrivendo un file CSV. Devo scrivere timestamp che siano accurati 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 accurato e inequivocabile da Excel con un intervento minimo da parte dell'utente?

È stato utile?

Soluzione

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

Credo che Excel non sia molto bravo con le frazioni di secondo (le perde quando interagisce con l'oggetto COM IIRC).

Altri suggerimenti

Il suggerimento precedente di usare " aaaa-MM-gg HH: mm: ss " va bene, anche se credo che Excel abbia una risoluzione temporale molto più fine di quella. Trovo questo post piuttosto credibile (segui il thread e vedrai un sacco di aritmetica e sperimentando Excel) e, se è corretto, avrai i tuoi millisecondi. Puoi semplicemente virare sulle cifre decimali alla fine, ad esempio "aaaa-mm-gg hh: mm: ss.000".

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

Per informazioni massime [1] trasmesse nelle celle senza intervento umano, potresti voler dividere il timestamp in una porzione di data e una porzione di tempo, con la porzione di tempo solo alla seconda. Mi sembra che Excel voglia darti al massimo tre livelli "quotati" visibili (dove le frazioni di secondo sono il loro livello) in una data cella e ne vuoi sette: anni, mesi, giorni, ore, minuti, secondi e frazioni di secondo.

Oppure, se non hai bisogno che il timestamp sia leggibile dall'uomo ma vuoi che sia il più preciso possibile, potresti preferire solo memorizzare un numero grande (internamente, Excel sta solo usando il numero di giorni, compresi i giorni frazionari, dalla data di "epoca").


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

"aaaa-MM-gg hh: mm: ss.000" il formato non funziona in tutte le versioni locali. Per alcuni (almeno danesi) "aaaa-MM-gg hh: mm: ss, 000" funzionerà meglio.

Credo che se avessi usato il tipo di dati double , il ricalcolo in Excel avrebbe funzionato bene.

Vai alle impostazioni della lingua nel Pannello di controllo, quindi su Opzioni formato, seleziona un'impostazione internazionale e visualizza il formato data effettivo per l'impostazione internazionale scelta utilizzata da Windows per impostazione predefinita. Sì, quel formato data / ora è sensibile alle impostazioni locali. Excel utilizza questi formati quando analizza CSV.

Inoltre, se la locale usa caratteri oltre ASCII, dovrai emettere CSV nella corrispondente pre-Unicode Windows " ANSI " tabella codici, ad es. CP1251. Excel non accetta UTF-8.

Per quanto riguarda i fusi orari. Devo memorizzare l'offset UTC come secondi da UTC in modo che le formule in Excel / OpenOffice possano eventualmente localizzare i tempi dei dati. Ho trovato questo più facile che memorizzare qualsiasi numero che ha uno 0 davanti. -0900 non ha analizzato bene in nessun sistema di fogli di calcolo e importare è stato quasi impossibile addestrare le persone a farlo.

  

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

come risposto dall'utente662894.

Voglio 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 (ovvero millisecondi).

Quindi "aaaa-mm-gg hh: mm: ss.000000" non funzionerà e quando Excel viene alimentato con questo tipo di stringa (dal file CSV), eseguirà arrotondamento anziché troncamento .

Questo può andare bene tranne quando è importante la precisione dei microsecondi, nel qual caso stai meglio NON innescando un riconoscimento automatico del tipo di dati ma mantieni la stringa come stringa ...

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

Codice Java per creare il file XML.

  
    

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

  
public String formatDate(Date date, String format)
{
    String dateString = "";
    if(null != date)
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        dateString = dateFormat.format(date);
    }
    return dateString;
}

Quindi, eccelle stranamente importa una data CSV in diversi modi. E , li visualizza in modo diverso a seconda del formato utilizzato nel file CSV. Sfortunatamente il formato ISO 8061 viene fornito come una stringa. Ciò ti impedisce di riformattare la data tu stesso.

Tutti quelli che arrivano come una data ... contengono tutte le informazioni ... ma si formattano in modo diverso ... se non ti piace puoi scegliere un nuovo formato per la colonna in Excel e funzionerà. (Nota: puoi dire che è arrivato come una data / ora valida come giustifica a destra ... se arriva come una stringa lo lascerà giustificato)

Ecco i formati che ho testato:

" aaaa-MM-dd " si presenta come una data ovviamente quando aperto in Excel. (funziona anche " MM / gg / aaaa ")

"aaaa-MM-gg HH: mm: ss" il formato di visualizzazione predefinito è " MM / gg / aaaa HH: mm " (data e ora senza secondi)

"aaaa-MM-gg HH: mm: ss.fff" il formato di visualizzazione predefinito è " HH: mm: ss " (tempo solo w / secondi)

Immagino che formato ISO sia una buona idea. ( articolo di Wikipedia , anche con informazioni temporali)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top