2011-03-16 6 views
7

Dizeleri ingilizce olmayan dillerde olan DateTime nesnelerine dönüştürmem gerekiyor. DateTime'ı diğer dillerdeki dizelere dönüştürmenin birçok örneğini gördüm, ancak başka bir şekilde değil.Arapça gibi İngilizce olmayan diller için DateTime.TryParse() öğesini nasıl kullanırım?

Bu işe görünmüyor:

CultureInfo provider = new CultureInfo("ar-AE"); // Arabic - United Arab Emirates 

string sample = "الاربعاء 16 مارس 2011"; // Arabic date in Gregorian calendar 
DateTime result; 
DateTime expected = new DateTime(2011, 3, 16); // the expected date 
bool b; 

b = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result); 

Assert.IsTrue(b); 
Assert.AreEqual(expected, result); 

Ayrıca, ben diğer takvimler olan dizeleri işlemek gerekir. Ben de denedim ve işe yaramıyor.

CultureInfo provider = new CultureInfo("ar-AE"); // Arabic - United Arab Emirates 
provider.DateTimeFormat.Calendar = new System.Globalization.HijriCalendar(); 
// Wednesday, March 16, 2011, 11 Rabi second in 1432 
string sample = " ‏11 ربيع ثاني 1432 "; 
DateTime result; 
DateTime expected = new DateTime(2011, 3, 16); // ? 
bool b; 

b = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result); 

Assert.IsTrue(b); 
Assert.AreEqual(expected, result); 

Neyi eksik?

+0

Arapça unicode normalleştirme (ya da benzer bir şey) ile küçük bir sorun olduğunu düşünüyorum ... Bence "Çarşamba" sözcüğü iki şekilde yazılabilir ... Eğer bekleniyorsa deneyin.ToString ("ddd dd MMMM yyyy ", sağlayıcı) dizenin aynı göründüğünü göreceksiniz, ama ikili eşit değil. 2. karakteriniz 0x0627 (ARAPÇA MEKTUP ALEF), ToString biri 0x0623 (HAMZA ABOVE İLE ARAPÇA MEKTUP ALEF). Arap bir şey bilmiyorum ama umarım bu size yardımcı olur. – xanatos

cevap

2

, sen TryParseExact ile kullanılmasını zorlayabilirsiniz:

b = DateTime.TryParseExact(sample, "dddd d MMMM yyyy", provider, DateTimeStyles.None, out result); 

Ancak, sizin durumunuzda bu değil iş. bir karakter girişiniz farklıdır (muhtemelen benden daha iyi olduğunu okuyabilir), hangi

Console.WriteLine(expected.ToString("dddd d MMMM yyyy", provider)); 

Ve sonuç “الأربعاء 16 مارس 2011” dir: Sorunu bulmak için, en tersi deneyelim:. NET hamza kullanır (ve bekler), sizin girdiniz yoktur. Bu şekilde giriş değiştirirseniz, her şey çalışıyor:

CultureInfo provider = new CultureInfo("ar-AE"); // Arabic - United Arab Emirates 

string sample = "الأربعاء 16 مارس 2011"; // Arabic date in Gregorian calendar 
DateTime result; 
DateTime expected = new DateTime(2011, 3, 16); // the expected date 
bool b; 

b = DateTime.TryParse(sample, provider, DateTimeStyles.None, out result); 

Assert.IsTrue(b); 
Assert.AreEqual(expected, result); 
+0

Ben de Arapça okumadım, ve kelimeler haftanın ve ayın günleri gibi görünüyor. Bir biçim dizesi belirledikten sonra oldukça iyi çalıştı. Teşekkürler! –

1
DateTime result = DateTime.Parse("الاربعاء 16 مارس 2011", new CultureInfo("ar-JO")); 

Ama belgelerine kontrol edebilirsiniz: Eğer kesin biçimini biliyorsanız CultureInfo Class

+0

Makinemde işe yaramadı, Ürdün'e taşınsak da? –

+0

Sadece örneğini denedim ve şunu aldım: "Dize geçerli bir DateTime olarak tanınmadı. Bilinmeyen bir kelime 0 dizininden başlıyor." Örneğini tam anlamıyla kopyaladım/yapıştırdım. Ne verir? –

+0

Hangi dilleri kullanacağınızı biliyor musunuz? – malinois

0
böyle

belki bir şey:
Sırası ile takvimler ay eklemek gerekir: senin birden fazla takvim destek olacak eğer

int Year, DayOfMonth; 
string Month; 
string[] Months = new string[] {"ينایر","فبرایر","مارس","ابریل","مایو",...};//these texts are writen with persian keyboard,change the ی with ي ,its really hard with my keymap 
string[] Splits = Input.Split(" "); 
foreach(string Split in Splits) 
{ 
    if(Months.Contains(Split)) 
    { 
     Month = Months.IndexOf(Split); 
    } 
    else 
    { 
     int Number; 
     if(int.TryParse(Split, out Number)) 
     { 
      if(Number<32) 
      { 
       DayOfMonth=Number; 
      } 
      else 
      { 
       Year=Number; 
      } 
     } 
    } 
} 

bu dizide. Aralık sonrası
(rabi-ol-avval, rabi-ol-sani, ...)
sonra

int CalendarId = Ay/12 sonraki takvim ay olmalıdır;
Ay% = 12;