मैं 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.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.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 वर्ग लागू इस इंटरफेस, तो यह आप अपने दिनांक समय तार के स्वरूपण नियंत्रित करने के लिए अनुमति देता है।