CSV / Excel için en iyi zaman damgası biçimi?


110

Bir CSV dosyası yazıyorum. En azından saniye ve tercihen milisaniye için doğru olan zaman damgaları yazmam gerekiyor. Bir CSV dosyasındaki zaman damgaları için, minimum kullanıcı müdahalesi ile Excel tarafından doğru ve net bir şekilde ayrıştırılabilecekleri için en iyi biçim nedir?


çıktı oluşturmak için hangi dili kullanıyorsunuz?
Peter Perháč

Yanıtlar:


104

İkinci doğruluk için, yyyy-MM-gg HH: mm: ss hile yapmalıdır.

Excel'in saniyenin kesirlerinde çok iyi olmadığına inanıyorum (COM nesnesi IIRC ile etkileşime girdiğinde bunları kaybediyor).


Evet - sana ve Fredrik'e katılıyorum. Bu referansları araştırırsanız, kesinlikle minnettar olurum. Teşekkürler!

18
Ruby'yi kullanan herkes strftimeiçin eşdeğer argüman dizesi"%Y-%m-%d %H:%M:%S"
Greg Matthew Crossley

2
@nickf - .CSVsadece bir metin dosyasıdır. Saat dilimini veya dosyaya yazdığınız herhangi bir şeyi virgülle ayrılmış düz metin olarak gösterebilirsiniz; önemli olan, hangi uygulamanın onu okuyacağı ve bu uygulamanın metni nasıl beklediği. Kongre Kütüphanesi'nden CSV standardı için belgeler . Tarihleri ​​özel olarak saklamanın önceden belirlenmiş bir yolu yoktur. Ayrıca RFC-4180 ve CSV-1203 //creativyst.com/Doc/Articles/CSV/CSV01.htm).
ashleedawg

C # / IronPython File.GetLastWriteTimeUtc ("yolunuz"). ToString ("yyyy-% m-% d% H:% MM:% ss")
Konrads

Strftime () içeren python'da format da "%Y-%m-%d %H:%M:%S"Ruby ile aynı olacaktır .
rcronk

18

"Yyyy-MM-gg HH: mm: ss" kullanmak için önceki öneri iyidir, ancak ben Excel'in bundan çok daha iyi zaman çözünürlüğüne sahip olduğuna inanıyorum. Bu gönderiyi oldukça güvenilir buluyorum (konuyu takip edin ve çok sayıda aritmetik ve Excel ile deneyler göreceksiniz) ve doğruysa, milisaniyelerinize sahip olacaksınız. Sonunda ondalık basamakları tutturabilirsiniz, yani "yyyy-aa-gg ss: dd: ss.000".

Excel'in verileri (insan müdahalesi olmadan) tüm bu hassasiyeti görebileceğiniz şekilde biçimlendirmeyebileceğinin farkında olmalısınız. İşteki bilgisayarımda, "yyyy-aa-gg ss: dd: ss.000" verileriyle (Not Defteri'ni kullanarak elle) bir CSV kurduğumda, hücrede "mm: ss.0" ve "m / g / yyyy ss: dd: ss ÖÖ / ÖS "formül çubuğunda.

İnsan müdahalesi olmadan hücrelerde aktarılan maksimum bilgi [1] için, zaman damganızı yalnızca saniye olacak şekilde bir tarih bölümü ve bir zaman bölümü olarak ayırmak isteyebilirsiniz. Bana öyle geliyor ki, Excel size herhangi bir hücrede en fazla üç görünür "düzey" (bir saniyenin kesirlerinin kendi düzeyleridir) vermek istiyor ve siz yedi: yıl, ay, gün, saat, dakika, saniye, ve bir saniyenin kesirleri.

Veya, zaman damgasının insan tarafından okunabilir olmasına ihtiyacınız yoksa ancak olabildiğince doğru olmasını istiyorsanız, yalnızca büyük bir sayı depolamayı tercih edebilirsiniz (dahili olarak, Excel yalnızca kesirli günler de dahil olmak üzere gün sayısını kullanır. , bir "çağ" tarihinden beri).


[1] Yani sayısal bilgi. Mümkün olduğunca fazla bilgi görmek istiyor ancak onunla hesaplama yapmayı umursamıyorsanız, Excel'in kesinlikle bir dize olarak ayrıştıracağı ve böylece kendi başına bırakacağı bir format oluşturabilirsiniz; örneğin "yyyyaagg.hhmmss.000".


14

"yyyy-AA-gg ss: dd: ss.000" biçimi tüm yerel ayarlarda çalışmaz. Bazıları için (en azından Danca) "yyyy-MM-gg ss: dd: ss, 000" daha iyi çalışacaktır.


2
Garip bir şekilde Excel 2010, milisaniye bölümü 000 olduğunda tarihleri ​​algılamıyor. Diğerleri işe yarayacaktır.
Dio F

4

doubleVeri türünü kullanırsanız, Excel'deki yeniden hesaplamanın gayet iyi çalışacağına inanıyorum .


Sadece denedim ve gerçekten güzel çalışıyor. Sadece Excell'e söz konusu sütunun formatının Tarih / Saat olduğunu söylemelisiniz. Açıkça verileri tanımlamadığı için bunu
CSV'den

3

Denetim Masası'ndaki dil ayarlarına gidin, ardından Biçim Seçenekleri'ne gidin, bir yerel ayar seçin ve varsayılan olarak Windows tarafından kullanılan seçilen yerel ayar için gerçek tarih biçimini görün. Evet, bu zaman damgası biçimi yerel ayara duyarlıdır. Excel, CSV'yi ayrıştırırken bu biçimleri kullanır.

Dahası, yerel ayar ASCII'nin ötesinde karakterler kullanıyorsa, karşılık gelen Unicode öncesi Windows "ANSI" kod sayfasında, örneğin CP1251'de CSV yayınlamanız gerekir. Excel, UTF-8'i kabul etmez.


1

Saat dilimlerine gelince. UTC farkını UTC'den saniye olarak depolamalıyım, böylece Excel / OpenOffice'deki formüllerin en sonunda veri saatlerini yerelleştirebilmesi. Bunu önünde 0 olan herhangi bir sayıyı saklamaktan daha kolay buldum. -0900 herhangi bir elektronik tablo sisteminde iyi bir şekilde ayrıştırılamadı ve içe aktarmak, insanları buna göre eğitmek neredeyse imkansızdı.


1

"yyyy-aa-gg ss: dd: ss.000" biçimi tüm yerel ayarlarda çalışmaz. Bazıları için (en azından Danca) "yyyy-aa-gg ss: dd: ss, 000" daha iyi çalışacaktır.

user662894 tarafından yanıtlandığı gibi.

Eklemek istiyorum: Mikrosaniyeleri, örneğin, SQL Server'ın datetime2 veri türünden almaya çalışmayın: Excel, 3 kesirli saniyeden (milisaniye) fazlasını işleyemez.

Yani "yyyy-aa-gg ss: dd: ss.000000" olmaz işler ve Excel (CSV dosyasından) dize bu tür beslenir, bunun gerçekleştireceğiz yuvarlama yerine kesilmesi .

Bu, mikrosaniye hassasiyetinin önemli olduğu durumlar haricinde iyi olabilir, bu durumda otomatik bir veri türü tanıma TETİKLEMEYİN, ancak dizeyi dize olarak tutmanız daha iyi olur ...


0

ISO formatının iyi bir fikir olduğunu tahmin ediyorum . ( Wikipedia makalesi , ayrıca zaman bilgisiyle birlikte)


1
(olumsuz oy; aslında hayır, excel bu formatı tanımıyor)
Doug

1
@Doug Bunu doğrulamak için az önce bir test yaptım: Office 2010, İngilizce sürümünde iyi çalışıyor, hem yerel ayarımla (İsveççe, tarihler için ISO formatını kullanıyor ve ABD İngilizcesi) denedim. İlgi dışı: Sizin için hangi ortamda başarısız oldu? Bazıları için işe yarayıp bazıları için başarısız olmasına hiç şaşırmadım: Excel, deneyimlerime göre gerçekten bir tutarlılık harikası değil ...
Fredrik Mörk

1
OSX için 2012 ofisinde kesinlikle çalışmıyor. Görünüşe göre testimde tanıdığı tek 'yerel' format excel AA / GG / YYYY SS: DD: SS; geri kalan her şey metin olarak kabul edildi.
Doug

1
Excel'in bir CSV'de ISO biçimi tarihlerini tanımadığını bulduktan sonra bu soruyu buldum. IMO, bu Excel'deki bir hatadır.
billpg

2
Bu @Patrick olabilir. Yani ;-) 2009 yılında testi arkasına biraz zordu
Fredrik Mork

0

AA / gg / yyyy ss: dd: ss biçimini deneyin.

XML dosyası oluşturmak için Java kodu.

xmlResponse.append ("mydate>"). append (this.formatDate (sonuçSet.getTimestamp ("tarih"), "AA / gg / yyyy ss: dd: 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;
}

0

Bu nedenle, garip bir şekilde excel, bir csv tarihini farklı şekillerde içe aktarır. Ve csv dosyasında kullanılan biçime bağlı olarak bunları farklı şekilde görüntüler. Maalesef ISO 8061 formatı bir dizge olarak geliyor. Bu, tarihi muhtemelen kendi başınıza yeniden biçimlendirmenizi engeller.

Bir tarih olarak gelenlerin tümü ... tüm bilgileri içerir ... ancak farklı biçimlendirirler ... beğenmezseniz, Excel'de sütun için yeni bir biçim seçebilirsiniz ve çalışacaktır. (Not: geçerli bir tarih / saat olarak geldiğini söyleyebilirsin, çünkü sağa doğru yaslar ... bir dize olarak gelirse sola yaslanır)

Test ettiğim formatlar:

"yyyy-AA-gg" elbette excel'de açıldığında bir tarih olarak görünür. (ayrıca "AA / gg / yyyy" çalışır)

"yyyy-AA-gg SS: dd: ss" varsayılan görüntüleme biçimi "AA / gg / yyyy SS: mm" şeklindedir (tarih ve saat, saniye hariç)

"yyyy-AA-gg SS: dd: ss.fff" varsayılan görüntü biçimi "SS: dd: sn" şeklindedir (yalnızca saniye cinsinden süre)


-1

Şu biçimde bir tarih saat sütununa sahip bir csv dosyası verildiğinde: yyyy-aa-gg ss: dd: ss

Excel bunu şu biçimde gösterir: gg / aa / yyyy hh: mm

ör. 2020-05-22 16:40:55, 22/05/2020 16:40 olarak gösterilir

Bu, Windows'ta seçilen Kısa tarih ve Kısa saat biçimi tarafından açıkça belirlenir; örneğin, Windows'ta Kısa tarih biçimini yyyy-aa-gg olarak değiştirirsem, Excel 2020-05-22 16:40 gösterir.

Can sıkıcı bir şekilde, Excel'in saniyeleri otomatik olarak göstermesini sağlayacak bir yol bulamıyorum (Excel'de sütunu manuel olarak biçimlendirmem gerekiyor). Ancak, csv dosyası hh: mm: ss biçiminde bir zaman sütunu içeriyorsa (ör. 16:40:55), saniyeler de dahil olmak üzere Excel'de bu gösterilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.