2009-09-02 15 views
53

Şuna benzeyen bir dizim var: "9/1/2009". Bir DateTime nesnesine (C# kullanarak) dönüştürmek istiyorum.Neden DateTime.ParseExact() "M/d/yyyy" kullanarak "9/1/2009" ayrıştırmadı

DateTime.Parse("9/1/2009", new CultureInfo("en-US")); 

Ama bu neden çalışmıyor anlamıyorum:

Bu işleri

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null); 

tarih (gibi "Eylül") hiçbir kelime var ve bildiğim Özel biçim, bu yüzden ParseExact kullanmayı tercih ediyorum (ve neden CultureInfo'nun gerekli olduğunu anlamıyorum). Ama ben "Dize geçerli bir DateTime olarak tanınmamış" istisna alıyorum.

Teşekkürler

Biraz takip edin. Burada

DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); 
DateTime.Parse("9/1/2009", new CultureInfo("en-US")); 

Ve işe yaramaz 3 edilir: Burada çalışmak 3 yaklaşımlardır

DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null); 

Yani, Ayrıştırma() "en-US" ile çalışır, ancak ParseExact değil ... Beklenmedik?

+0

Hangi .NET sürümünü kullanıyorsunuz? Win7'de PowerShell v2'de ikinci satırı çalıştırdığımda, gayet iyi çalışıyor. – Lee

+0

.net 3.5 xp kullanıyorum. Varsayılan kültür en-us. – Jimmy

+1

"M/d/yyyy" dizesinde, '/' karakterlerinin her biri 'culture.DateTimeFormat.DateSeparator 'dizesi ile değiştirilir. Format sağlayıcı olarak "null" verdiğinizde, mevcut kültür kullanılır. Şimdi, şu anki kültürün "/" veya başka bir dizgeye ("DateSeparator") (http://msdn.microsoft.com/) olarak "-" veya "". "Gibi) olmasına bağlıdır. en-us/kütüphane/system.globalization.datetimeformatinfo.dateseparator.aspx). –

cevap

85

Sorun, veri dizesindekilere karşı biçim dizesindeki eğik çizgiler olduğundan şüpheleniyorum. Bu, biçim dizesindeki kültüre duyarlı bir tarih ayırıcı karakterdir ve son bağımsız değişken null "geçerli kültürü kullan" anlamına gelir. ya da işaretlerinden kaçarsanız ("M"/'d'/'yyyy ") veya belirtecekseniz CultureInfo.InvariantCulture, sorun olmaz. herkes bu çoğaltılması ilgilenen varsa

:

// Works 
DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", 
            new CultureInfo("de-DE")); 

// Works 
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
            new CultureInfo("en-US")); 

// Works 
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
            CultureInfo.InvariantCulture); 

// Fails 
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
            new CultureInfo("de-DE")); 
+0

Haklısın, bunlardan biri işe yarayacak. Hangisini tercih ettiğimden emin değilim. Slashes kaçan sanırım daha kompakt ... Teşekkürler, bu bir süredir beni nagging olmuştu! – Jimmy

+0

İkinci örneğinizin neden sizin için çalıştığından emin değilim. Bu benim için çalışmıyor. CultureInfo ("en-US") kullanma, bu tarih dizesi için Parse() ile çalışır, ancak bu tarih dizesi ve biçim dizesiyle ParseExact ile çalışmaz. – Jimmy

+1

@Jimmy: Niyete göre değişir. Bu durumda,/tam bir eğik çizgi olarak ve * kültüre duyarlı bir ayırıcı olarak * değil * (kültür "İnvariantCulture" olduğunda bile), niyetinizi daha iyi ifade eden seçenek, alıntılanan eğik çizgi olanıdır. seçilmiş). –

2

Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")) 
+0

Eğer kültürü belirtmem gerekiyorsa, DateTime.Parse ("9/1/2009", yeni CultureInfo ("en-US")) kullanmayı tercih ederim. – Jimmy

+0

Bir tarihi ayrıştırdığınızda her yeni CultureInfo örneğini ("en-US") başlatmak yerine, CultureInfo.InvariantCulture'ı kullanın. – Joe

+0

Aslında bu işe yaramaz (en azından benim için?) "En-US" ParseExact ile çalışır, ancak ParseExact kullanma (bu tarih ve biçim dizgisi için) – Jimmy

0

bu

provider = new CultureInfo("en-US"); 
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider); 

Bye deneyin deneyin.

2

Eminim makinenizin kültürü "en-US" değil. the documentation Gönderen:

sağlayıcı Bir null başvuru (Visual Basic hiçbir şey) 'dir, şimdiki kültür kullanılır. Mevcut kültür değildir "en-us" ise o "en-us" olmak benim için çalışıyor ama açıkça kültür belirtmek zaman ve işleri için çalışmıyor neden

, bu açıklıyor .

+0

Nah, ilginçtir, CultureInfo.CurrentCulture "en-us" geri dönüyor “... bu yüzden sizin için neden işe yarayacağını açıklayamam ama emin değilim. – Jimmy

+0

Birkaç şey denedim. İşte ne işe yarar: DateTime.ParseExact ("9/1/2009", "M '/' d '/' yyyy", null); DateTime.ParseExact ("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); DateTime.Parse ("9/1/2009", yeni CultureInfo ("en-US")); İşte ne işe yaramıyor: DateTime.ParseExact (dateString, "M/d/yyyy", CultureInfo.CurrentCulture); DateTime.ParseExact (dateString, "M/d/yyyy", yeni CultureInfo ("en-US")); DateTime.ParseExact (dateString, "M/d/yyyy", null); So Parse(), "en-US" ile çalışır, ancak ParseExact ... ile ilgili değil mi? – Jimmy

+0

Woops formatting hepsi berbat. Soruyu ekleyeceğim. – Jimmy

0

XP'de denedim ve bilgisayar Uluslararası saat yyyy-M-d olarak ayarlanmışsa çalışmaz. Satırda bir kesme noktası yerleştirin ve işlenmeden önce '/' yerine '-' kullanmak için tarih dizgisini değiştirin ve işe yaradığını görürsünüz. CultureInfo'nuz olup olmadığını farketmez. Sadece ayırıcının göz ardı edilmesini sağlamak için deneyimli bir formatı belirleyebilmek garip görünüyor.

-2

DateTimePicker'in Biçim özelliğini, özel olarak ve CustomFormat için M/dd/yyyy olarak ayarlayın.

+1

Bu sorunun DateTimePicker ile kesinlikle ilgisi yoktur. –

-1

deneyin: Web yapılandırma dosyasında

yapılandır

<system.web> <globalization culture="ja-JP" uiCulture="zh-HK" /> </system.web>

örn: DateTime dt = DateTime.ParseExact ("2013/08/21", "AA/gg/yyyy" , boş);

ref url: http://support.microsoft.com/kb/306162/

+0

Bu soruda bir web uygulaması öneren hiçbir şey yok. –

İlgili konular