سؤال

أقوم حاليًا بكتابة تقويم صغير في ASP.Net C#.حاليًا لإنتاج صفوف الأسابيع، أقوم بما يلي للحلقة:

var iWeeks = 6;
for (int w = 0; w < iWeeks; w++) {

يعمل هذا بشكل جيد، ومع ذلك، في بعض الأشهر سيكون هناك 5 أسابيع فقط، وفي بعض الحالات النادرة، 4.

كيف يمكنني حساب عدد الصفوف المطلوبة لشهر معين؟

هذا مثال على ما أقوم بإنشائه:

enter image description here

كما ترون في الشهر أعلاه، لا يوجد سوى 5 صفوف مطلوبة.خذ هذا الشهر (أغسطس 2008) الذي بدأ يوم السبت وينتهي يوم الاثنين في الأسبوع السادس/الصف.

الصورة وجدت على جوجل


هذا مثال على ما أقوم بإنشائه:

enter image description here

كما ترون في الشهر أعلاه، لا يوجد سوى 5 صفوف مطلوبة.خذ هذا الشهر (أغسطس 2008) الذي بدأ يوم السبت وينتهي يوم الاثنين في الأسبوع السادس/الصف.

الصورة وجدت على جوجل

هل كانت مفيدة؟

المحلول

وإليك الطريقة التي تفعل ذلك:

public int GetWeekRows(int year, int month)
{
    DateTime firstDayOfMonth = new DateTime(year, month, 1);
    DateTime lastDayOfMonth = new DateTime(year, month, 1).AddMonths(1).AddDays(-1);
    System.Globalization.Calendar calendar = System.Threading.Thread.CurrentThread.CurrentCulture.Calendar;
    int lastWeek = calendar.GetWeekOfYear(lastDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    int firstWeek = calendar.GetWeekOfYear(firstDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return lastWeek - firstWeek + 1;
}

يمكنك تخصيص قاعدة أسبوع التقويم عن طريق تعديل الجزء System.Globalization.CalendarWeekRule.FirstFourDayWeek.آمل أن يكون الكود واضحًا بذاته.

نصائح أخرى

حسنًا، يعتمد ذلك على الثقافة التي تستخدمها، ولكن لنفترض أنه يمكنك استخدام Thread.CurrentThread.CurrentCulture، فإن رمز الحصول على أسبوع اليوم سيكون:

Culture culture = Thread.CurrentThread.CurrentCulture;
Calendar cal = culture.Calendar;
Int32 week = cal.GetWeekOfYear(DateTime.Today,
    culture.DateTimeFormat.CalendarWeekRule,
    culture.DateTimeFormat.FirstDayOfWeek);

ماذا عن التحقق من الأسبوع الذي سيكون فيه اليوم الأول والأخير؟

يفحص التقويم.GetWeekOfYear.ينبغي أن تفعل الخدعة.

توجد مشكلة فيه، فهو لا يتبع قاعدة الأربعة أيام حسب ISO 8601، ولكنه بخلاف ذلك فهو أنيق.

يمكنك الحصول على أيام الشهر باستخدام DateTime.DaysInMonth(int WhatYear,int WhatMonth);

الأشهر في التقويم اليولياني/الغريغوري لها نفس عدد الأيام كل عام، باستثناء فبراير الذي يمكن أن يكون 28 أو 29 يومًا اعتمادًا على كبيسة العام.يمكنك العثور على عدد الأيام في قسم الوصف على http://en.wikipedia.org/wiki/Gregorian_calendar.

كما ذكرdarkdog لديك DateTime.DaysInMonth.فقط افعل هذا:

var days = DateTime.DaysInMonth(year, month) + 
           WhatDayOfWeekTheMonthStarts(year, month);    
int rows = (days / 7);  
if (0 < days % 7)  
{  
    ++rows;
}  

خذ في الاعتبار حقيقة أنه لأغراض العولمة/التوطين، تستخدم بعض أجزاء العالم تقاويم/طرق تنظيم مختلفة للسنة.

المشكلة ليست في عدد أيام الشهر، بل في عدد الأسابيع التي يمتد فيها.

سيكون شهر فبراير في السنة غير الكبيسة مكونًا من 28 يومًا، وإذا كان اليوم الأول من الشهر هو يوم الاثنين، فسيمتد شهر فبراير إلى أرقام 4 أسابيع بالضبط.

ومع ذلك، إذا كان اليوم الأول من الشهر هو يوم الثلاثاء، أو أي يوم آخر من أيام الأسبوع، فإن شهر فبراير سيمتد إلى 5 أسابيع.

يمكن أن يمتد الشهر المكون من 31 يومًا إلى 5 أو 6 أسابيع بنفس الطريقة.إذا كان الشهر يبدأ يوم الاثنين، فإن 31 يومًا تعطيك أرقام 5 أسابيع.إذا بدأ الشهر يوم السبت أو الأحد، فسوف يمتد إلى 6 أسابيع.

لذا فإن الطريقة الصحيحة للحصول على هذا الرقم هي إيجاد رقم الأسبوع للأيام الأولى والأخيرة من الشهر.


تحرير رقم 1:فيما يلي كيفية حساب عدد الأسابيع التي تمتد لشهر معين:تحرير رقم 2:البق الثابتة في التعليمات البرمجية

public static Int32 GetWeekForDateCurrentCulture(DateTime dt)
{
    CultureInfo culture = Thread.CurrentThread.CurrentCulture;
    Calendar cal = culture.Calendar;
    return cal.GetWeekOfYear(dt,
        culture.DateTimeFormat.CalendarWeekRule,
        culture.DateTimeFormat.FirstDayOfWeek);
}

public static Int32 GetWeekSpanCountForMonth(DateTime dt)
{
    DateTime firstDayInMonth = new DateTime(dt.Year, dt.Month, 1);
    DateTime lastDayInMonth = firstDayInMonth.AddMonths(1).AddDays(-1);
    return
        GetWeekForDateCurrentCulture(lastDayInMonth)
        - GetWeekForDateCurrentCulture(firstDayInMonth)
        + 1;
}

جرب هذا،

DateTime.DaysInMonth

اكتشف أولاً أي يوم من أيام الأسبوع يقع فيه اليوم الأول من الشهر.لقد تم تحديث التاريخ والوقت باليوم الأول، دائمًا 1، والسنة والشهر المعنيين، ويوجد به خاصية يوم من الأسبوع.

ومن هنا يمكنك استخدام عدد أيام الشهر، DateTime.DaysInMonth, ، لتحديد عدد الأسابيع التي تقسم فيها على سبعة ثم تضيف عدد الأيام من 1 الذي يقع فيه يومك الأول.على سبيل المثال،

public static int RowsForMonth(int month, int year)
{
    DateTime first = new DateTime(year, month, 1);

    //number of days pushed beyond monday this one sits
    int offset = ((int)first.DayOfWeek) - 1;

    int actualdays = DateTime.DaysInMonth(month, year) +  offset;

    decimal rows = (actualdays / 7);
    if ((rows - ((int)rows)) > .1)
    {
        rows++;
    }
    return rows;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top