Format cap waktu terbaik untuk CSV / Excel?

110

Saya sedang menulis file CSV. Saya perlu menulis stempel waktu yang akurat setidaknya untuk detik, dan lebih disukai untuk milidetik. Apa format terbaik untuk cap waktu dalam file CSV sehingga dapat diurai secara akurat dan tidak ambigu oleh Excel dengan intervensi pengguna yang minimal?


sumber
bahasa apa yang Anda gunakan untuk membuat keluaran?
Peter Perháč

Jawaban:

104

Untuk akurasi kedua, yyyy-MM-dd HH: mm: ss harus melakukan triknya.

Saya percaya Excel tidak terlalu baik dengan sepersekian detik (kehilangan mereka saat berinteraksi dengan objek COM IIRC).

Joe
sumber
Ya - Saya setuju dengan Anda dan Fredrik. Jika Anda bisa menggali referensi itu, saya pasti akan berterima kasih. Terima kasih!
18
Untuk siapa pun yang menggunakan Ruby strftime, string argumen yang setara adalah"%Y-%m-%d %H:%M:%S"
Greg Matthew Crossley
2
@nickf - .CSVhanyalah file teks. Anda dapat menampilkan zona waktu atau apa pun yang Anda tulis ke file sebagai teks biasa yang dipisahkan koma; apa yang penting adalah apa aplikasi akan membaca itu, dan bagaimana yang aplikasi mengharapkan teks. Berikut dokumentasi untuk standar CSV dari Library of Congress. Tidak ada cara khusus untuk menyimpan kurma. Juga RFC-4180 dan CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm).
ashleedawg
C # / IronPython File.GetLastWriteTimeUtc ("your-path-here"). ToString ("yyyy-% m-% d% H:% MM:% ss")
Konrads
Di python dengan strftime () formatnya juga "%Y-%m-%d %H:%M:%S"- sama seperti Ruby.
rcronk
18

Saran sebelumnya untuk menggunakan "yyyy-MM-dd HH: mm: ss" baik-baik saja, meskipun saya yakin Excel memiliki resolusi waktu yang jauh lebih baik daripada itu. Saya menemukan posting ini agak kredibel (ikuti utas dan Anda akan melihat banyak aritmatika dan bereksperimen dengan Excel), dan jika benar, Anda akan memiliki milidetik Anda. Anda bisa memasukkan tempat desimal di akhir, yaitu "tttt-bb-hh jj: mm: ss.000".

Anda harus menyadari bahwa Excel mungkin tidak memformat data (tanpa campur tangan manusia) sedemikian rupa sehingga Anda akan melihat semua presisi itu. Di komputer saya di kantor, saat saya menyiapkan CSV dengan data "yyyy-mm-hh jj: mm: ss.000" (dengan tangan menggunakan Notepad), saya mendapatkan "mm: ss.0" di sel dan "m / d / tttt jj: mm: dd AM / PM "di bilah rumus.

Untuk informasi maksimum [1] yang disampaikan dalam sel tanpa campur tangan manusia, Anda mungkin ingin membagi stempel waktu Anda menjadi bagian tanggal dan bagian waktu, dengan bagian waktu hanya ke detik. Bagi saya sepertinya Excel ingin memberikan paling banyak tiga "level" yang terlihat (di mana sepersekian detik adalah levelnya sendiri) dalam sel tertentu, dan Anda menginginkan tujuh: tahun, bulan, hari, jam, menit, detik, dan sepersekian detik.

Atau, jika Anda tidak memerlukan stempel waktu agar dapat dibaca manusia tetapi Anda ingin agar seakurat mungkin, Anda mungkin lebih memilih untuk menyimpan jumlah yang besar (secara internal, Excel hanya menggunakan jumlah hari, termasuk hari pecahan , sejak tanggal "zaman").


[1] Yaitu, informasi numerik. Jika Anda ingin melihat informasi sebanyak mungkin tetapi tidak peduli tentang melakukan penghitungan dengannya, Anda dapat membuat beberapa format yang pasti akan diurai oleh Excel sebagai string, dan dengan demikian biarkan saja; misalnya "yyyymmdd.hhmmss.000".

John Y
sumber
14

Format "yyyy-MM-hh jj: mm: ss.000" tidak berfungsi di semua bahasa. Untuk beberapa (setidaknya bahasa Denmark), "yyyy-MM-dd hh: mm: ss, 000" akan bekerja lebih baik.

pengguna662894
sumber
2
Anehnya Excel 2010 tidak mendeteksi tanggal ketika bagian milidetik adalah 000. Yang lain akan melakukannya.
Dio F
4

Saya yakin jika Anda menggunakan doubletipe data, penghitungan ulang di Excel akan bekerja dengan baik.

Peter Perháč
sumber
Saya baru saja mencoba dan itu bekerja dengan sangat baik. Hanya perlu memberi tahu Excell bahwa format kolom tertentu adalah Tanggal / Waktu. Ini tidak akan mendeteksi ini secara otomatis dari CSV karena jelas tidak menggambarkan data
Peter Perháč
3

Buka pengaturan bahasa di Panel Kontrol, lalu Opsi Format, pilih lokal dan lihat format tanggal aktual untuk lokal yang dipilih yang digunakan oleh Windows secara default. Ya, format stempel waktu itu peka terhadap bahasa lokal. Excel menggunakan format tersebut saat mengurai CSV.

Lebih jauh lagi, jika lokal menggunakan karakter di luar ASCII, Anda harus memancarkan CSV di halaman kode "ANSI" Windows pra-Unicode yang sesuai, misalnya CP1251. Excel tidak akan menerima UTF-8.

John Smith
sumber
1

Adapun zona waktu. Saya harus menyimpan UTC offset sebagai detik dari UTC sehingga rumus di Excel / OpenOffice pada akhirnya dapat melokalkan waktu data. Saya menemukan ini lebih mudah daripada menyimpan nomor apa pun yang memiliki 0 di depannya. -0900 tidak mengurai dengan baik di sistem spreadsheet mana pun dan mengimpor hampir tidak mungkin melatih orang untuk melakukannya.

whardier
sumber
1

Format "yyyy-mm-hh jh: mm: ss.000" tidak berfungsi di semua bahasa. Untuk beberapa (setidaknya bahasa Denmark) "yyyy-mm-dd hh: mm: ss, 000" akan bekerja lebih baik.

seperti yang dibalas oleh user662894.

Saya ingin menambahkan: Jangan mencoba untuk mendapatkan mikrodetik dari, katakanlah, tipe data datetime2 SQL Server: Excel tidak dapat menangani lebih dari 3 pecahan detik (mis. Milidetik).

Jadi "yyyy-mm-hh jj: mm: ss.000000" tidak akan berfungsi, dan saat Excel diberi makan jenis string ini (dari file CSV), Excel akan melakukan pembulatan daripada pemotongan .

Ini mungkin baik-baik saja kecuali ketika presisi mikrodetik penting, dalam hal ini Anda lebih baik dengan TIDAK memicu pengenalan tipe data otomatis tetapi simpan saja string sebagai string ...

Hansjp
sumber
0

Saya rasa format ISO adalah ide yang bagus. ( Artikel Wikipedia , juga dengan info waktu)

Fredrik Mörk
sumber
1
(suara negatif; sebenarnya, tidak, excel tidak mengenali format itu)
Doug
1
@Doug Saya baru saja menjalankan tes untuk memverifikasinya: berfungsi dengan baik di Office 2010, edisi bahasa Inggris, mencoba dengan kedua pengaturan lokal saya (Swedia, yang kebetulan menggunakan format ISO untuk tanggal, dan Inggris AS). Karena minat: di lingkungan mana ia gagal untuk Anda? Saya sama sekali tidak terkejut bahwa ini berfungsi untuk beberapa dan gagal untuk beberapa: Excel sebenarnya bukan keajaiban konsistensi dalam pengalaman saya ...
Fredrik Mörk
1
Ini pasti tidak berfungsi di office 2012 untuk OSX. Satu-satunya excel format 'asli' yang tampak mengenali dalam pengujian saya adalah MM / DD / YYYY HH: MM: SS; yang lainnya hanya diperlakukan sebagai teks.
Doug
1
Saya menemukan pertanyaan ini setelah menemukan bahwa Excel tidak mengenali tanggal format ISO dalam CSV. IMO, itu bug di Excel.
billpg
2
Itu mungkin, @Patrick. Itu agak sulit untuk diuji pada tahun 2009 ;-)
Fredrik Mörk
0

Coba BB / hh / tttt jj: mm: dd dalam format.

Kode Java untuk membuat file XML.

xmlResponse.append ("mydate>"). append (this.formatDate (resultSet.getTimestamp ("date"), "MM / dd / yyyy 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;
}
Anoop Velluva
sumber
0

Jadi, anehnya excel mengimpor tanggal csv dengan cara yang berbeda. Dan , menampilkannya secara berbeda tergantung pada format yang digunakan di file csv. Sayangnya format ISO 8061 hadir sebagai string. Yang mencegah Anda dari kemungkinan memformat ulang tanggal itu sendiri.

Semua yang datang sebagai tanggal ... berisi seluruh informasi ... tetapi formatnya berbeda ... jika Anda tidak menyukainya, Anda dapat memilih format baru untuk kolom di excel dan itu akan berfungsi. (Catatan: Anda dapat mengatakan itu datang sebagai tanggal / waktu yang valid karena itu akan membenarkan ... jika itu datang sebagai string itu akan meninggalkan rata)

Berikut adalah format yang saya uji:

"yyyy-MM-dd" muncul sebagai tanggal kursus saat dibuka di excel. (juga "MM / dd / yyyy")

"tttt-BB-hh JJ: mm: dd" format tampilan default adalah "BB / hh / tttt JJ: mm" (tanggal dan waktu tanpa detik)

"yyyy-MM-hh HH: mm: ss.fff" format tampilan default adalah "HH: mm: ss" (hanya waktu w / detik)

Brian Rice
sumber
-1

Diberikan file csv dengan kolom datetime dalam format ini: yyyy-mm-hh jj: mm: ss

Excel menunjukkannya dalam format ini: hh / bb / tttt jj: mm

misalnya 2020-05-22 16:40:55 ditampilkan sebagai 22/05/2020 16:40

Ini jelas ditentukan oleh format tanggal pendek dan waktu singkat yang dipilih di Windows; misalnya, jika saya mengubah format tanggal pendek di Windows menjadi tttt-bb-hh, Excel akan menampilkan 2020-05-22 16:40.

Sayangnya, saya tidak dapat menemukan cara untuk membuat Excel menampilkan detik secara otomatis (saya harus memformat kolom secara manual di Excel). Tetapi jika file csv menyertakan kolom waktu dalam format jj: mm: dd (misalnya 16:40:55), itulah yang ditampilkan di Excel, termasuk detik.

pengguna13608643
sumber