2010-01-04 14 views
6

जानने के बिना डेटटाइम का उपयोग करना। मेरे पास एक विधि है (कभी-कभी) "dddd MMMM dd" (सोमवार 04 जनवरी) प्रारूप में एक स्ट्रिंग में ले जाती है जिसे डेटटाइम में पार्स करने की आवश्यकता होती है। मैं कभी-कभी कहता हूं क्योंकि यह मूल्य के रूप में "Today" या "Tomorrow" में भी पारित हो सकता है।दिनांक

इस संभाल करने के लिए कोड काफी सरल था:

if (string.Compare(date, "Today", true) == 0) 
    _selectedDate = DateTime.Today; 
else if (string.Compare(date, "Tomorrow", true) == 0) 
    _selectedDate = DateTime.Today.AddDays(1); 
else 
    _selectedDate = DateTime.Parse(date); 

इस दिसंबर के मध्य तक काम किया। आप में से कुछ शायद पहले ही देख चुके हैं कि क्या गलत हुआ।

यह त्रुटि साथ नए साल में किसी भी तारीख पर विफल रहे हैं होगा:

"String was not recognized as a valid DateTime because the day of week was incorrect."

यह पारित कर दिया हो रही किया गया था "Monday January 04" जो 2010 के लिए कोई मान्य दिनांक है, लेकिन में नहीं 2009

तो मेरी सवाल यह है: क्या वर्ष या तो अगले वर्ष या अगले वर्ष के लिए सेट करने का कोई तरीका है? अभी, एक त्वरित और गंदा ठीक है, मैं इस है:

if (!DateTime.TryParseExact(date, "dddd MMMM dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out _selectedDate)) 
    if (!DateTime.TryParseExact(date + " " + (DateTime.Now.Year + 1), "dddd MMMM dd yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out _selectedDate)) 
     throw new FormatException("That date is not valid."); 

तो यह यह चालू वर्ष का उपयोग कर, और अगर यह असफल होने पर इसे फिर से अगले साल का उपयोग कर की कोशिश करेंगे पार्स करने के लिए कोशिश करेंगे। यदि उसके बाद यह विफल हो जाता है, तो यह अनुमान लगाएगा कि यह एक अमान्य तिथि है क्योंकि मुझे केवल 1 साल पहले चिंता करने की आवश्यकता है, लेकिन अगर किसी के पास अधिक लचीला समाधान है, तो मैं इसकी सराहना करता हूं। (ध्यान दें, मुझे पास होने वाली तारीख को सत्यापित करने के बारे में चिंता करने की आवश्यकता नहीं है, यह वर्तमान या अगले वर्ष के लिए मान्य होगा)।

उत्तर

8

सबसे पहले, आपके यूनिट परीक्षण ने इसे पकड़ा होगा। आप इस कार्यक्षमता से सीखने के लिए इस विधि के लिए लिखे गए परीक्षणों पर फिर से विचार करना चाहेंगे कि आपकी कार्यक्षमता को और अधिक तरीके से कैसे कवर किया जाए।

दूसरा, क्या कोई विशेष कारण है कि आप के बजाय String.Compare का उपयोग कर रहे हैं? मैं अधिक पठनीय निम्नलिखित पर विचार करें:

date.Equals("Today", StringComparison.InvariantCultureIgnoreCase); 

मुझे लगता है कि यह अधिक स्पष्ट रूप से पढ़ता है क्या हो रहा है (विशेष रूप से के रूप में हम याद करने के लिए क्या अंतिम bool पैरामीटर String.Compare में इसका मतलब नहीं है)।

अब, अपने प्रश्न का दिल प्राप्त करने के लिए। आपकी विधि पूरी तरह से ठीक है और तर्क स्पष्ट रूप से व्यक्त करती है।

public DateTime ParseInThisYearOrNextYear(string s, out DateTime dt) 
{ 
    if (!Parse(s, "dddd MM dd", out dt)) 
    { 
     if (!Parse(s + " " + DateTime.Now.Year + 1, "dddd MM dd yyyy", out dt)) 
     { 
      throw new FormatException(); 
     } 
    } 

    return dt; 
} 

bool Parse(string s, string format, out DateTime dt) 
{ 
    return DateTime.TryParseExact(
     s, 
     format, 
     CultureInfo.InvariantCulture, 
     DateTimeStyles.None, 
     out dt 
    ); 
} 

यह कार्यक्षमता के दो अलग टुकड़ों में अपने विधि अलग करती है और अपने आप को दोहरा (CultureInfo.InvariantCulture और DateTimeStyles.None) परीक्षण और रखरखाव थोड़ा आसान बनाने से रोकता है: मैं एक छोटा सा पुनर्रचना तथापि होगा। (शायद आप Parse से बेहतर विधि नाम चाहते हैं; मैंने स्क्रॉल बार को कोड विंडो में दिखाई देने से रोकने के लिए एक छोटा सा चुना है।)

एक आखिरी चेतावनी के रूप में (आपके सिस्टम के विवरण जानने के बिना) आप चाहें पूर्व वर्ष की जांच करने पर विचार करने के लिए! बस निम्न स्थितियों की कल्पना करें:

  1. इनपुट "गुरुवार 31 दिसंबर" (200 9 के लिए मान्य) है।
  2. सिस्टम 1 जनवरी को 2010 में 1 रोल पर रोल करता है।
  3. कोड निष्पादित और 2010 और 2011 दोनों की जांच करता है जो विफल हो जाते हैं।

बस आपके सिस्टम की प्रकृति के आधार पर विचार करने के लिए कुछ। पहले पैराग्राफ पर

+3

+1000। यह एक आदर्श उदाहरण है जहां इकाई परीक्षण ने विकास चक्र –

+0

में बहुत पहले समस्या का समाधान किया होगा उत्कृष्ट उत्तर के लिए धन्यवाद। यूनिट परीक्षण हैं, मैंने कभी इस परिदृश्य को कभी नहीं माना :(ऐसा कोई कारण नहीं है कि मैं दूसरे पर तारों की तुलना करने की एक विधि का उपयोग कर रहा हूं। मुझे यकीन नहीं था कि यह mattered है या नहीं। इसके अलावा, मुझे चिंता करने की ज़रूरत नहीं है पूर्व वर्ष में किसी तारीख को चुनने के लिए पूर्व वर्ष की अनुमति नहीं है। धन्यवाद। – Brandon

+0

मुझे ब्रैकेट की आवश्यकता है (डेटटाइम.अब। प्रिय + 1) अन्यथा मैं अपने वर्ष के अंत में 1 के साथ समाप्त हुआ, उदाहरण के लिए 20181 –

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