2011-03-01 10 views
14

मैं एक खोज वाक्यविन्यास के हिस्से के रूप में मुक्त-फॉर्म तिथियों का उपयोग कर रहा हूं। मुझे तारों से तिथियों का विश्लेषण करने की आवश्यकता है, लेकिन केवल उस तारीख के हिस्सों को संरक्षित करें जो वास्तव में निर्दिष्ट हैं। उदाहरण के लिए, "नवंबर 1, 2010" एक विशिष्ट तारीख है, लेकिन "नवंबर 2010" "नवम्बर 1, 2010" की तारीखों की सीमा "30 नवंबर, 2010" है।निर्दिष्ट सभी मानों के बिना पार्सिंग तिथियां

दुर्भाग्य से, DateTime.Parse और दोस्तों के एक ही DateTime को इन तिथियों को पार्स:

DateTime.Parse("November 1, 2010") // == {11/1/2010 12:00:00 AM} 
DateTime.Parse("November, 2010") // == {11/1/2010 12:00:00 AM} 

मुझे पता है कि जो DateTime के कुछ हिस्सों वास्तव में पार्स कर रहे थे और जो पार्सर द्वारा अनुमान लगाया गया की जरूरत है। अनिवार्य रूप से, मुझे DateTime.Parse("November, 2010") == {11/-1/2010 -1:-1:-1} की आवश्यकता है; मैं तब देख सकता हूं कि दिन का हिस्सा गुम है और पूरे महीने को कवर करने वाली तिथियों की सीमा की गणना करता है।

(आंतरिक रूप से, सी # DateTimeParse और DateTimeResult कक्षाएं उस तारीख को पार्स और वास्तव में जानकारी की आवश्यकता की रक्षा है, लेकिन समय से तारीख सार्वजनिक इंटरफेस इसे बंद छीन लिया गया है करने के लिए वापस हो जाता है। मैं नहीं बल्कि में दर्शाती से बचने चाहते हैं इन वर्गों, जब तक कि यह वास्तव में एकमात्र मार्ग नहीं है।)

क्या DateTime.Parse प्राप्त करने का कोई तरीका है यह बताएं कि यह किस प्रारूप को दिनांक को पार्स करने के लिए उपयोग किया जाता है? या लौटाए गए DateTime में अनिर्दिष्ट भागों के लिए प्लेसहोल्डर्स हो सकते हैं? मैं एक और तारीख पार्सर का उपयोग करने के लिए भी खुला हूं, लेकिन मैं इसे आंतरिक के रूप में विश्वसनीय और लोकेल-लचीला होना चाहता हूं। अग्रिम में धन्यवाद।

संपादित करें: मैंने ParseExact भी कोशिश की है, लेकिन Parse सभी प्रारूपों को समझाते हुए लगभग असंभव प्रतीत होता है। Parse वास्तव में DateTimeFormatInfo.GetAllDateTimePatterns द्वारा लौटाए गए से अधिक प्रारूप स्वीकार करता है, जो कि मुझे लगता है कि एक स्रोत के रूप में कैननिकल के बारे में है।

उत्तर

2

आप TryParseExact() का उपयोग करने का प्रयास कर सकते हैं, जो विफल हो जाएगा यदि डेटा स्ट्रिंग निर्दिष्ट सटीक प्रारूप में नहीं है। अलग-अलग संयोजनों का एक समूह आज़माएं, और जब कोई आपको सफल बनाता है तो तिथि उस प्रारूप के बारे में जानती है, और इस प्रकार आप उस तारीख के उन हिस्सों को जानते हैं जो वहां नहीं थे और जिसके लिए पार्सर डिफ़ॉल्ट रूप से भर गया था। नकारात्मकता यह है कि आपको यह अनुमान लगाना होगा कि उपयोगकर्ता तिथियों को कैसे दर्ज करना चाहता है, ताकि आप इसकी अपेक्षा कर सकें।

आप डेट स्ट्रिंग को स्वयं पचाने के लिए रेगेक्स का भी उपयोग कर सकते हैं। दोबारा, आपको अलग-अलग regexes (या वास्तव में जटिल एकल एक) की आवश्यकता होगी, लेकिन स्ट्रिंग को इस तरह से अलग करना भी निश्चित रूप से संभव है; तो आप जानते हैं कि वास्तव में आपके पास क्या है।

+0

कृपया मेरे संपादन ऊपर देखें। ParseExact सामान्य दिनांक पार्सिंग के लिए अपर्याप्त प्रतीत होता है। – kevingessner

0

अनिवार्य रूप से, मैं DateTime.Parse ("नवंबर, 2010") की जरूरत == {11/-1/2010 -1: -1: -1}; मैं देख सकता हूं कि दिन का हिस्सा गुम है और पूरे महीने को कवर करने वाली तिथियों की सीमा की गणना करता है।

आप जो चाहते हैं वह एक अवैध डेटटाइम है क्योंकि आपके पास नकारात्मक घंटे/सेकंड/मिनट/दिन के मूल्य नहीं हो सकते हैं। यदि आप कुछ और वापस करना चाहते हैं तो एक कानूनी डेटटाइम आपको अपनी खुद की विधि लिखनी होगी जो डेटटाइम नहीं लौटाती है।

वहाँ किसी तरह DateTime.Parse मुझे बताने की जो प्रारूप यह तिथि को पार्स करने के लिए इस्तेमाल प्राप्त करने के लिए है? या लौटाया गया दिनांक समय के लिए प्लेसहोल्डर्स अनिर्दिष्ट भागों के लिए हो सकता है?मैं भी खुला एक और तारीख पार्सर का उपयोग करने के हूँ, लेकिन मैं चाहते है जैसे कि यह के रूप में विश्वसनीय और स्थान-लचीला आंतरिक एक के रूप में किया जाना है।

आप मैन्युअल रूप से इस कार्य को करने के लिए दर्ज किया गया है क्या का ट्रैक रखने के करने के लिए जा रहे हैं एक नज़र यहाँ http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx

लो। एकमात्र समाधान यह सुनिश्चित करना है कि इनपुट सही प्रारूप में है।

+3

मुझे लगता है कि -1 विनिर्देशक सिर्फ इतना कहना है एक उदाहरण था 'मैं एक विधि की जरूरत है जो संकेत है जो दिनांक समय उस पर अनुमान लगाया के टुकड़े' सचमुच नहीं है कि वह -1 के साथ वहाँ मूल्यों दिनांक समय चाहता था। –

+1

माइकल प्रायर सही है, मेरा मतलब अनिश्चित भागों के लिए केवल प्लेसहोल्डर के रूप में -1 था। – kevingessner

2

Parse एक बहुत सारी चीजें पार्स करता है जो कोई भी व्यक्ति "January/2010 - 21 12: 00 :2" जैसी तिथि के रूप में दर्ज नहीं करेगा। मुझे लगता है कि अगर आप जानना चाहते हैं कि उपयोगकर्ता वास्तव में क्या दर्ज करता है तो आपको अपना खुद का डेट पार्सर लिखना होगा।

व्यक्तिगत रूप से मैं इसे कीथ्स की तरह करता हूं: Parse के साथ स्ट्रिंग को पार्स करें और डेटटाइम ऑब्जेक्ट के किसी एक फ़ील्ड में 0 है तो केवल अपना स्वयं का पार्स फ़ंक्शन कॉल करें। ऐसी संभावनाएं नहीं हैं जिनकी आपको जांच करने की आवश्यकता है, क्योंकि यदि दिन 0 है, तो समय भी 0 होगा। तो .. जाँच वर्ष, माह, दिन, आदि शुरू

या बस विशिष्ट प्रारूप आप को पहचान का उपयोग करने के उपयोगकर्ता निर्देश दें।

+1

"पार्स के साथ स्ट्रिंग को पार्स करें और डेटटाइम ऑब्जेक्ट के किसी एक फ़ील्ड में 0 है, तो केवल अपने स्वयं के पार्स फ़ंक्शन को कॉल करें।" - अफसोस की बात है, डेटटाइम का दिन हिस्सा कभी भी 0 नहीं हो सकता है। यदि यह अनिर्दिष्ट है तो इसे 1 पर सेट किया गया है, जिसे इसे 1 के रूप में निर्दिष्ट करने से अलग नहीं किया जा सकता है। – kevingessner

0

मैं इस विधि इसी क्रम में मूल स्ट्रिंग के लिए वापस चला जाता है प्रयोग किया जाता है दिन और वर्ष के होने की जाँच करने के लिए:

  • दिनों के लिए, मूल स्ट्रिंग पूर्णांक अगर के रूप में एक 1 शामिल होना चाहिए दिन निर्दिष्ट किया गया था। तो, स्ट्रिंग को विभाजित करें और 1 के लिए देखो। एकमात्र अपवाद तब होता है जब माह जनवरी (# 1 महीने) होता है, इसलिए आपको मूल स्ट्रिंग में दो 1 एस या 1 और "जनवरी" या "जनवरी" की जांच करनी चाहिए।
  • साल के लिए, मूल स्ट्रिंग एक नंबर है कि एक साल हो सकता है (जैसे कि, 1900 से 2100) शामिल होना चाहिए। अन्य संभावनाओं एपोस्ट्रोफ़ी का इस्तेमाल या 02-10-16 तरह बातें, जो आप तथ्य यह है कि वास्तव में तीन नंबर देखते हैं कि द्वारा पहचान सकते हैं हो सकता है।

मुझे पता है कि यह सुंदर ह्युरिस्टिक है, लेकिन यह एक तेज़ और सरल समाधान है जो ज्यादातर मामलों में काम करता है। मैंने लाइब्रेरी में DateFinder.DayExists() और DateFinder.YearExists() विधियों में सी # में इस एल्गोरिदम को कोड किया।

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