2011-02-03 5 views
13

मैं एक साधारण कैलेंडर बनाने के लिए क्या करना चाहता हूं, और मैं एक विशिष्ट महीने के पहले सप्ताह के पहले दिन को ढूंढना चाहता हूं। मेरा कैलेंडर सोमवार -> रविवार कैलेंडर है और निम्न कोड काम करता है, लेकिन जैसा कि आप देख सकते हैं कि यह अच्छा नहीं है। कैलेंडर में पहली तारीख कैसे प्राप्त करें इस पर कोई भी बेहतर विचार है।कैलेंडर का पहला दिन ढूंढना

var now = new DateTime(Year, Month, 1); 
now = now.AddDays(1-(int)now.DayOfWeek); 
now = now.Day > 15 ? now : now.AddDays(-7); 

कैलेंडर इस तरह देख खत्म हो जाएगा:

| < |  Jan 2011  | > | 
------------------------------------ 
| Mo | Tu | We | Th | Fr | Sa | Su | 
|[27]| 28 | 29 | 30 | 31 | 01 | 02 | 
| 03 | 04 | 05 | 06 | 07 | 08 | 09 | 
| .. | .. | .. | .. | .. | .. | .. | 
| .. | .. | .. | .. | .. | .. | .. | 
| 31 | 01 | 02 | 03 | 04 | 05 | 06 | 

और यह "छवि" में यह [27] की तारीख है कि मैं खोजने की कोशिश कर रहा हूँ है।

समाधान (मिले मैं बेहतर/पाश करने के लिए क्लीनर तो गणना):

public DateTime FirstDay() 
    { 
     var date = new DateTime(Date.Year, Date.Month, 1); 
     while (true) 
     { 
      if (date.DayOfWeek == DayOfWeek.Monday) 
       return date; 
      date = date.AddDays(-1); 
     } 
     return date; 
    } 

    public DateTime LastDay() 
    { 
     var date = new DateTime(Date.Year, Date.Month, 
           DateTime.DaysInMonth(Date.Year, Date.Month)); 
     while (true) 
     { 
      if (date.DayOfWeek == DayOfWeek.Sunday) 
       return date; 
      date = date.AddDays(1); 
     } 
     return date; 
    } 

/बी आर एंड्रियास

+4

+1, के लिए ASCII कला। –

+0

+1 # वाह, असल में मैंने अपने कॉलेज में सी के साथ एक कंसोल ऐप में एक समान कैलेंडर बनाया। –

उत्तर

9

मैं बस ऐसा करूँगा। यह इतना समझने में आसान है: इसके अतिरिक्त

var firstDayOfMonth = new DateTime(year, month, 1); 
DateTime startOfCalendar = 
    FirstDayOfWeekOnOrBefore(
     firstDayOfMonth, 
     DayOfWeek.Monday 
    ); 

public static DateTime FirstDayOfWeekOnOrBefore(
    DateTime date, 
    DayOfWeek dayOfWeek 
) { 
    while(date.DayOfWeek != dayOfWeek) { 
     date = date.AddDays(-1); 
    } 
    return date; 
} 

, आप अपने कैलेंडर बदलने से शुक्रवार के अलावा कुछ पर शुरू करने के लिए चाहते हैं, यह अब तुच्छ है। मॉड्यूलो अंकगणित का उपयोग कर एक समाधान बनाए रखने योग्य नहीं होगा। कोड के बाद एक बग है:

+0

यह इतना जटिल क्यों है? बहुत सरल समाधान मौजूद हैं – user492238

+0

@ user492238 आईएमओ यह कोड आपके (और मेरे) समाधान से सरल है। लूप अधिकतम 7 पुनरावृत्तियों के बाद समाप्त हो जाता है, इसलिए प्रदर्शन भी ठीक है। – CodesInChaos

4

आप सापेक्ष का उपयोग एक सशर्त बयान बिना भराव दिनों की संख्या की गणना करने के कर सकते हैं:

DateTime firstOfMonth=new DateTime(year,month,1); 
var weekDay=firstOfMonth.DayOfWeek; 
int fillerDays=((int)weekDay+6)%7; 
DateTime firstDayInCalendar=firstOfMonth.AddDays(-fillerDays); 
+0

अच्छा। मुझे नहीं पता था कि डेऑफविक को एक int में डालना संभव था।मैंने हमेशा यह देखा है कि यह दिन स्ट्रिंग प्रदर्शित करता है: "सोमवार"। –

+0

@DougS यह एक enum है, और आप अंतर्निहित अभिन्न प्रकार के लिए किसी भी enum कास्ट कर सकते हैं। – CodesInChaos

+0

@ CodeInChaos: जानना अच्छा है। धन्यवाद! –

1

आप इस संभालने के पहले दिन की चर्चा करते हुए उर कोशिश कर सकते हैं सोमवार

DateTime dt = new DateTime(2011, 2, 2); 
Console.WriteLine(dt.AddDays((8 - (int)dt.DayOfWeek) % 7)); 
+0

लेकिन क्यों? यह तुरंत समझ में नहीं आता है। स्पष्ट कोड है जिसे तुरंत पकड़ लिया जा सकता है। आप इसे तीन महीने में लिखने की सराहना करेंगे जब आपको कुछ बनाए रखने की ज़रूरत है, या स्वर्ग मना कर दिया जाए, इसमें एक बुरा बग ठीक करें क्योंकि यह इतना अस्पष्ट है। – jason

-1

अद्यतन है! परिस्थिति की भरपाई करने के लिए मॉड्यूलो अंकगणित का प्रयोग करें, .NET रविवार को सप्ताह में शुरू होता है! यहां अन्य समाधान देखें (बिना किसी अतिरिक्त फ़ंक्शन वाले)।

आप "27" (यानी एक महीने के प्रदर्शन के लिए पहले दिन) बस इस का उपयोग खोजने के लिए की जरूरत है:

DateTime monthStart = new DateTime(year, month, 1); 
DateTime monthDisplayStart = monthStart.AddDays(-((int)monthStart.DayOfWeek - 1)); 
+0

के लिए डाउनवोट क्या है? – user492238

+1

मैं डाउन-वोटर नहीं हूं, लेकिन मुझे संदेह है कि आपका कोड एक संभावित सप्ताह के लिए काम नहीं करता है क्योंकि नेट सप्ताह के पहले दिन और ओपी सोमवार को देखता है। – CodesInChaos

+0

इस कोड में एक बग है, इसका अर्थ तुरंत स्पष्ट नहीं है, और यह बनाए रखने योग्य नहीं है। – jason

1

मैं नहीं की तरह while लूप में, क्योंकि वे महंगे हैं जब साथ प्रयोग किया जाता है LINQ
आशा किसी और इस कोड को पुन: उपयोग कर सकते हैं: दो पंक्तियों में) (यदि आप संयुक्त राज्य अमेरिका में कर रहे हैं, तो बस [% 7) + 6 निकालने के लिए)]

/// <summary> 
    /// Expands the month. 
    /// | < |  Jan 2011  | > | 
    /// ------------------------------------ 
    /// | Mo | Tu | We | Th | Fr | Sa | Su | 
    /// |[27]| 28 | 29 | 30 | 31 | 01 | 02 | 
    /// | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 
    /// | .. | .. | .. | .. | .. | .. | .. | 
    /// | .. | .. | .. | .. | .. | .. | .. | 
    /// | 31 | 01 | 02 | 03 | 04 | 05 | 06 | 
    /// </summary> 
    /// <param name="start">Some day in the month of interest, the start date is updated to become the date of firstDayInCalendar</param> 
    /// <returns>The number of days to show. This value is either (28, 35 or 42)</returns> 
    public static int ExpandMonth(ref DateTime start) 
    { 
     DateTime first = new DateTime(start.Year, start.Month, 1); 
     DateTime last = new DateTime(start.Year, start.Month, DateTime.DaysInMonth(start.Year, start.Month)); 
     start = first.AddDays(-((int)first.DayOfWeek + 6) % 7); 
     last = last.AddDays(7 - ((int)last.DayOfWeek + 6) % 7); 
     return last.Subtract(start).Days; 
    } 

// थॉमस

0

मुझे खुद को अक्सर ऐसा करने की आवश्यकता है, इसलिए मैंने निम्न विस्तार विधि बनाई है।

public static DateTime FirstDateOfCalendarMonth(this DateTime dt, DayOfWeek firstDayOfWeek = DayOfWeek.Sunday) 
{ 
    dt = new DateTime(dt.Year, dt.Month, 1); 
    while (dt.DayOfWeek != firstDayOfWeek){ 
    dt = dt.AddDays(-1); 
    } 
    return dt; 
} 

इस

var firstCalDate = DateTime.Now.FirstDateOfCalendarMonth(); 
पहले सप्ताह का दिन के रूप में रविवार को

यह चूक, लेकिन आप इसे पारित कर सकते हैं जो कुछ सप्ताह का दिन आप चाहें, तो इस तरह है जैसे कि यह प्रयोग करें:

var firstCalDate = DateTime.Now.FirstDateOfCalendarMonth(DayOfWeek.Monday);