2015-09-30 7 views
6

मैं उम्म अल-Qura कैलेंडर में निम्नलिखित अरबी तारीख है कि मैं एक नेट दिनांक समय वस्तु में पार्स करने के लिए करना चाहते हैं: 17 ذو الحجة, 1436मैं एक अरबी उम्म अल-कुरा तिथि स्ट्रिंग को .NET डेटटाइम ऑब्जेक्ट में कैसे पार्स कर सकता हूं?

इस तिथि के बराबर है

الأربعاء ग्रेगोरियन कैलेंडर में 30 सितंबर 2015।

मैं इस तिथि को पार्स करने के लिए निम्न "मानक" सी # कोड की कोशिश कर रहा है, लेकिन सफलता नहीं मिली:

var cultureInfo = new CultureInfo("ar-SA"); 
cultureInfo.DateTimeFormat.Calendar = new UmAlQuraCalendar(); // the default one anyway 

var dateFormat = "dddd، dd MMMM، yyyy"; //note the ، instead of , 

var dateString = "‏الأربعاء‏، 17‏ ذو الحجة‏، 1436"; 
DateTime date; 
DateTime.TryParseExact(dateString, dateFormat, cultureInfo.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out date); 

कोई फर्क नहीं पड़ता कि मुझे क्या करना, TryParseExact का परिणाम हमेशा false है। मैं इस स्ट्रिंग को .NET में ठीक से कैसे पार्स करूं?

वैसे, अगर मैं एक DateTime वस्तु से शुरू, मैं समस्याओं के बिना DateTime पर ToString() के भार के का उपयोग करके उपरोक्त सही तारीख स्ट्रिंग बना सकते हैं। मैं बस इसे स्पष्ट रूप से दूसरी तरफ नहीं कर सकता।

+0

मुझे लगता है कि आप सुरक्षित रूप से 'CultureInfo.GetCultureInfoByIetfLanguageTag (" ए आर-SA ") द्वारा पहले दो लाइनों की जगह ले सकता;' लेकिन यह इस मुद्दे को ठीक प्रतीत नहीं होता है। – Gimly

+0

@Gimly: यह सही है, अगर मैं कन्स्ट्रक्टर के बजाय आपकी प्रस्तावित विधि का उपयोग करता हूं तो कुछ भी नहीं बदलेगा। –

+1

क्या आप ToString() परिणाम पोस्ट कर सकते हैं? क्या आप ToString() के परिणाम को डेटटाइम() पर वापस पा सकते हैं? यदि आप ToString() परिणामों को पार्स कर सकते हैं तो दो स्ट्रिंग समान नहीं हो सकती हैं। मैं यह सुनिश्चित करने के लिए कि वे समान हैं, दो तारों के चरित्र द्वारा वर्ण की तुलना करना चाहते हैं। – jdweng

उत्तर

3

आपका डेटास्टिंग 30 वर्ण लंबा है और इसमें चार यूनिकोड 8207 U+200FRIGHT TO LEFT MARK वर्ण हैं, लेकिन आपकी डेटफॉर्मेट नहीं है।

// This gives a string 26 characters long 
var str = new DateTime(2015,9,30).ToString(dateFormat, cultureInfo.DateTimeFormat) 

RIGHT TO LEFT MARK सफेद जगह नहीं है।

यदि इसमें केवल आरएलएम/एलआरएम/एएलएम शामिल है तो आपको शायद उन्हें बाहर निकालना चाहिए। अलग एलआरआई/आरएलआई/एफएसआई और पीडीआई सेट, और एलआरई/आरएलई सेट के साथ ही। हालांकि आप एलआरओ के साथ ऐसा नहीं करना चाहेंगे। एलआरओ अक्सर विरासत डेटा के साथ प्रयोग किया जाता है जहां आरटीएल पात्र विपरीत क्रम में संग्रहीत होते हैं, यानी बाएं से दाएं क्रम में। इन मामलों में आप वास्तव में पात्रों को उलटना चाहते हैं।

यादृच्छिक स्थानों से पार्सिंग तिथियां एक कठिन समस्या है। आपको एक स्तरित समाधान की आवश्यकता है, पहले एक विधि का प्रयास करें, फिर दूसरा सफल होने तक प्राथमिकता क्रम में। यद्यपि कोई 100% समाधान नहीं है, क्योंकि लोग टाइप कर सकते हैं कि वे क्या पसंद करते हैं।

अधिक जानकारी के लिए देखें: http://www.unicode.org/reports/tr9/

+0

तो आप कह रहे हैं कि मुझे आरटीएल मार्क अक्षरों को डेट प्रारूप में स्पष्ट रूप से शामिल करना होगा, जैसा कि मैं चरित्र के साथ करता हूं? –

+0

निर्भर करता है। आपकी स्ट्रिंग हार्ड-कोडेड है - क्या आरएलएम हमेशा वहां या कभी-कभी होगा? से डेटा कहां है? क्या अन्य यूनिकोड दिशात्मक अंक दिखाई देंगे? आप एलआरओ कैसे संभालेंगे? – Ben

+0

दोनों तारीख स्ट्रिंग और इसका प्रारूप एमएस वर्ड (डॉक्क्स) फ़ाइल के अंतर्निहित एक्सएमएल से आ रहा है, इसलिए मेरे पास उनके ऊपर अधिक नियंत्रण नहीं है। मैं उम्मीद कर रहा था कि तिथि, कैलेंडर और प्रारूप का उपयोग करके मैं उन्हें डेटटाइम ऑब्जेक्ट में सीधे तरीके से पार्स कर पाऊंगा। –

2

यह एक दाएं से बाएं संस्कृति है, जिसका अर्थ है कि वर्ष पहले प्रस्तुत किया जाएगा। उदाहरण के लिए, निम्न कोड:

var cultureInfo = new CultureInfo("ar-SA"); 
cultureInfo.DateTimeFormat.Calendar = new UmAlQuraCalendar(); 
Console.WriteLine(String.Format(cultureInfo,"{0:dddd، dd MMMM، yyyy}",DateTime.Now)); 

الأربعاء، 17 ذو الحجة، 1436 पैदा करता है।

var dateString="الأربعاء، 17 ذو الحجة، 1436"; 
var result=DateTime.TryParseExact(dateString, dateFormat, cultureInfo.DateTimeFormat, 
            DateTimeStyles.AllowWhiteSpaces,out date); 
Debug.Assert(result); 

पुनश्च:: इस स्ट्रिंग पार्स समस्या के बिना काम करता रहा पता नहीं कैसे, मूल इनपुट पार्स करने के लिए मुझे क्या एक अल्पविराम की तरह दिखता है की स्थिति बदलती के रूप में प्रारूप स्ट्रिंग लिखने के लिए, बदल जाता है स्ट्रिंग में प्रस्तुत वास्तविक वर्ण।

+0

मुझे यकीन नहीं है कि मैं आपके कोड से समझ गया हूं कि आपको एहसास हुआ कि स्ट्रिंग बिना किसी समस्या के काम करता है। अगर मुझे गलत नहीं लगता है, तो हम अपनी मूल पोस्ट में बिल्कुल वही स्ट्रिंग के बारे में बात कर रहे हैं, "الأربعاء, 17 ذو الحجة, 1436"। –

+1

मुझे * एहसास नहीं हुआ *, मैं इसे चलाता हूं। जो मैंने अभी महसूस किया है, वह है कि प्रतिलिपि/चिपकाना * आपकी * स्ट्रिंग लिंककपैड को 'var dateString = "الأربعاء, 17 ذو الحجة, 1436"; '। विंडोज पता लगाता है कि यूनिकोड स्ट्रिंग आरटीएल है या नहीं, और बदलाव जैसे कि कर्सर तीर क्या करता है, पाठ कैसे चिपकाया जाता है आदि। जैसा कि @ बेन ने उत्तर दिया है, दो तार शायद * नहीं * समान हैं। –

संबंधित मुद्दे

 संबंधित मुद्दे