मैं Datetime.ParseExact विधि के साथ चारों ओर खेल रहा था, और यह एक IFormatProvider चाहता है ...
यह अशक्त इनपुट काम करता है, लेकिन यह वास्तव में क्या करता है?
मैं Datetime.ParseExact विधि के साथ चारों ओर खेल रहा था, और यह एक IFormatProvider चाहता है ...
यह अशक्त इनपुट काम करता है, लेकिन यह वास्तव में क्या करता है?
जवाबों:
इयान बॉयड के उत्तर के लिए:
CultureInfoइस इंटरफ़ेस को भी लागू करता है और आपके मामले में उपयोग किया जा सकता है। तो आप उदाहरण के लिए एक फ्रांसीसी तारीख स्ट्रिंग पार्स कर सकते हैं; आप उपयोग कर सकते हैं
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)इसके बजाय उपयोग करना चाहिए , मेरा मानना है कि - जैसे: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);कृपया अपने उत्तर को संशोधित करें।
IFormatProviderइंटरफ़ेस सामान्य रूप से एक से आप के लिए लागू किया गया है CultureInfoवर्ग, जैसे:
CultureInfo.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.CreateSpecificCulture("de-CA") //German (Canada)इंटरफ़ेस एक संस्कृति से संस्कृति-विशिष्ट डेटा का एक सेट प्राप्त करने के लिए एक फ़ंक्शन के लिए एक प्रवेश द्वार है। दो आमतौर पर उपलब्ध संस्कृति की वस्तुओं को जिनके बारे में IFormatProviderसमझा जा सकता है:
जिस तरह से यह आम तौर पर काम करेगा IFormatProviderआप एक DateTimeFormatInfoवस्तु देने के लिए कहेंगे :
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
ज्ञान के अंदर यह भी है कि किसी भी IFormatProviderइंटरफ़ेस को संभवतः उस वर्ग द्वारा कार्यान्वित किया जा रहा है जो नीचे से आता है CultureInfo, या इससे नीचे उतरता है DateTimeFormatInfo, इसलिए आप सीधे इंटरफ़ेस डाल सकते हैं:
CultureInfo info = provider as CultureInfo;
if (info != null)
format = info.DateTimeInfo;
else
{
DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
if (dtfi != null)
format = dtfi;
else
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}
if (format != null)
DoStuffWithDatesOrTimes(format);
वह सारी मेहनत आपके लिए पहले ही लिखी जा चुकी है:
एक DateTimeFormatInfoसे प्राप्त करने के लिएIFormatProvider :
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
एक NumberFormatInfoसे प्राप्त करने के लिएIFormatProvider :
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
इसका मूल्य IFormatProviderयह है कि आप अपनी संस्कृति की वस्तुएं बनाते हैं। जब तक वे लागू होते हैं IFormatProvider, और उन वस्तुओं को वापस करते हैं जिन्हें वे मांगते हैं, आप अंतर्निहित संस्कृतियों को बायपास कर सकते हैं।
आप IFormatProviderमनमानी संस्कृति वस्तुओं को पारित करने के तरीके के लिए भी उपयोग कर सकते हैं - के माध्यम से IFormatProvider। जैसे विभिन्न संस्कृतियों में भगवान का नाम
यह आपके कस्टम LordsNameFormatInfoवर्ग को एक के अंदर सवारी करने देता है IFormatProvider, और आप मुहावरे को संरक्षित कर सकते हैं।
वास्तव में आपको खुद को कभी भी कॉल GetFormatकरने की आवश्यकता नहीं होगी IFormatProvider।
जब भी आपको आवश्यकता हो IFormatProviderआप एक CultureInfoवस्तु पास कर सकते हैं :
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
नोट : कोई भी कोड सार्वजनिक डोमेन में जारी किया जाता है। कोई एट्रिब्यूशन की आवश्यकता नहीं है।
अशक्त गुजरना IFormatProviderऐसा करने का सही तरीका नहीं है। यदि उपयोगकर्ता के पास अपने पीसी पर एक कस्टम दिनांक / समय प्रारूप है, तो आपको पार्स करने और स्ट्रिंग में परिवर्तित करने में समस्याएँ होंगी। मैंने अभी एक बग तय किया है जहां किसी ने स्ट्रिंग में परिवर्तित होने पर IFormatProvider के रूप में शून्य पारित किया था।
इसके बजाय आपको उपयोग करना चाहिए CultureInfo.InvariantCulture
गलत:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
सही बात:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
CultureInfo.InvariantCultureबदले हमें उपयोग करना चाहिए CultureInfo.CurrentCulture?
nullडिफ़ॉल्ट रूप से पास हो जाएगा CultureInfo.CurrentCulture। कॉल को संदर्भ स्रोत में देखें , यदि आप कॉल की श्रृंखला का अनुसरण करते हैं, तो अंत में नल को बदल दिया जाता DateTimeFormatInfo.CurrentInfoहै, जो CultureInfo.CurrentCultureआउटपुट के बराबर है ।
IFormatProvider संस्कृति की जानकारी प्रश्न में विधि को प्रदान करता है। DateTimeFormatInfo IFormatProvider को लागू करता है, और आपको वह प्रारूप निर्दिष्ट करने की अनुमति देता है जिसे आप अपनी तिथि / समय दिखाना चाहते हैं। उदाहरण MSDN पृष्ठों पर देखे जा सकते हैं।
आप यहाँ देख सकते हैं http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
टिप्पणी और उदाहरण अनुभाग देखें।
IFormatProviderउपयोग नहीं करता है IFormatProvider।
API के लिए http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx देखें ।
MSDN द्वारा
.NET फ्रेमवर्क में संस्कृति-विशिष्ट जानकारी प्रदान करने के लिए निम्नलिखित तीन पूर्वनिर्धारित IFormatProvider कार्यान्वयन शामिल हैं जो संख्यात्मक और दिनांक और समय मानों को स्वरूपित करने या पार्स करने में उपयोग किए जाते हैं:
NumberFormatInfoवर्ग, जो जानकारी प्रदान करता है, जिसका उपयोग किसी विशेष संस्कृति के लिए मुद्रा, हजारों विभाजक और दशमलव विभाजक जैसे संख्याओं को प्रारूपित करने के लिए किया जाता है। किसी NumberFormatInfoऑब्जेक्ट द्वारा पहचाने गए पूर्वनिर्धारित स्वरूप स्ट्रिंग के बारे में जानकारी के लिए और संख्यात्मक स्वरूपण कार्यों में उपयोग किया जाता है, मानक संख्यात्मक प्रारूप स्ट्रिंग और कस्टम संख्यात्मक प्रारूप स्ट्रिंग देखें।DateTimeFormatInfoवर्ग, जो जानकारी प्रदान करता है, जिसका उपयोग दिनांक और समय को प्रारूपित करने के लिए किया जाता है, जैसे किसी विशेष संस्कृति के लिए दिनांक और समय विभाजक प्रतीक या किसी तिथि के वर्ष, महीने और दिन के घटकों के क्रम और स्वरूप। किसी DateTimeFormatInfoऑब्जेक्ट द्वारा पहचाने गए पूर्वनिर्धारित प्रारूप स्ट्रिंग के बारे में जानकारी के लिए और संख्यात्मक स्वरूपण कार्यों में उपयोग किया जाता है, मानक दिनांक और समय प्रारूप स्ट्रिंग और कस्टम दिनांक और समय प्रारूप स्ट्रिंग देखें।CultureInfoवर्ग है, जो एक विशेष संस्कृति का प्रतिनिधित्व करता है। इसका GetFormatतरीका एक संस्कृति-विशिष्ट NumberFormatInfoया DateTimeFormatInfoऑब्जेक्ट देता है, जो इस बात पर निर्भर करता है कि CultureInfoऑब्जेक्ट का उपयोग फॉर्मेटिंग या पार्सिंग ऑपरेशन में किया जाता है जिसमें नंबर या दिनांक और समय शामिल होते हैं।.NET फ्रेमवर्क भी कस्टम स्वरूपण का समर्थन करता है। इसमें आमतौर पर एक प्रारूपण वर्ग का निर्माण शामिल होता है जो IFormatProvider और ICustomFormatter दोनों को लागू करता है। इस वर्ग का एक उदाहरण फिर एक पैरामीटर के रूप में पारित किया जाता है जो एक कस्टम स्वरूपण ऑपरेशन करता है, जैसे कि String.Format(IFormatProvider, String, Object[])।
DateTimeFormatInfo वर्ग लागू इस इंटरफेस, तो यह आप अपने दिनांक समय तार के स्वरूपण नियंत्रित करने के लिए अनुमति देता है।