وظيفة لتحديد اليوم الأول من الشهر، آخر يوم من الشهر، إلخ.

StackOverflow https://stackoverflow.com/questions/1506378

  •  19-09-2019
  •  | 
  •  

سؤال

أخلق جدولة وتحتاج إلى أن أكون قادرا على القيام بما يلي في C #:

  1. العثور على الثلاثاء الأول من يونيو 2012
  2. العثور على الجمعة الأخيرة من مارس 2008
  3. العثور على كل يوم سبت في يناير 2013
  4. العثور على الجمعة الثالثة في يوليو 2009
  5. العثور على كل يوم سبت على مدى 3 أشهر القادمة
  6. البحث كل يوم في مارس 2018

يجب أن تعود النتائج DateTime أو List<DateTime>.

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

المحلول

فيما يلي طرق للعثور على أول يوم محدد في الأسبوع / الأخير في شهر معين:

public DateTime GetFirstDayOfWeekInMonth(int year, int month, DayOfWeek dayOfWeek)
{
    DateTime dt = new DateTime(year, month, 1);
    int first = (int)dt.DayOfWeek;
    int wanted = (int)dayOfWeek;
    if (wanted < first)
        wanted += 7;
    return dt.AddDays(wanted - first);
}

public DateTime GetLastDayOfWeekInMonth(int year, int month, DayOfWeek dayOfWeek)
{
    int daysInMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(year, month);
    DateTime dt = new DateTime(year, month, daysInMonth);
    int last = (int)dt.DayOfWeek;
    int wanted = (int)dayOfWeek;
    if (wanted > last)
        last += 7;
    return dt.AddDays(wanted - last);
}

من تلك، يمكنك بسهولة العثور على إجابات الأسئلة الأخرى ... فقط أضف 7 أيام للعثور على الحدوث التالي في اليوم الذي تبحث عنه


تحرير: التفكير في المزيد حول هذا الموضوع، سيكون من المفيد للغاية أن يكون ذلك في شكل طرق التمديد، مثل:

Console.WriteLine("Next monday : {0}", DateTime.Today.Next(DayOfWeek.Monday));
Console.WriteLine("Last saturday : {0}", DateTime.Today.Previous(DayOfWeek.Saturday));

هنا هو التنفيذ:

public static class DateExtensions
{
    public static DateTime Next(this DateTime from, DayOfWeek dayOfWeek)
    {
        int start = (int)from.DayOfWeek;
        int wanted = (int)dayOfWeek;
        if (wanted < start)
            wanted += 7;
        return from.AddDays(wanted - start);
    }

    public static DateTime Previous(this DateTime from, DayOfWeek dayOfWeek)
    {
        int end = (int)from.DayOfWeek;
        int wanted = (int)dayOfWeek;
        if (wanted > end)
            end += 7;
        return from.AddDays(wanted - end);
    }
}

ربما تكون أكثر مرونة أكثر من الأساليب الأولى التي اقترحتها ... مع ذلك، يمكنك بسهولة أن تفعل أشياء مثل هذا:

// Print all Sundays between 2009/01/01 and 2009/03/31
DateTime from = new DateTime(2009, 1, 1);
DateTime to = new DateTime(2009, 3, 31);
DateTime sunday = from.Next(DayOfWeek.Sunday);
while(sunday <= to)
{
   Console.WriteLine(sunday);
   sunday = sunday.AddDays(7);
}

نصائح أخرى

مستوحاة من هذا السؤال يبدو وكأنه شيء ممتع لجعل شيء يسمح لك بتعامل مع التواريخ كسلسلة واستعلام منها مع LINQ. لقد صنعت مشروعا بسيطا يمكن تنزيله هنا من جيثب. لا أعرف ما إذا كان من الضروري إضافته إلى التحكم بالمصدر لأنني أشك في أنني سأعمل عليه، لكن كان عليه أن يحميله في مكان ما وتحميله على RapidShare بدا رمودا قليلا :)

سنداتك الأولى حلها مع "LinQ-to DateTime":

  /*
   *    1. Find the 1st Tuesday of June 2012
        2. Find the last Friday of March 2008
        3. Find every Saturday in January 2013
        4. Find the 3rd Friday in July 2009
        5. Find every Saturday over the next 3 months
        6. Find every day in March 2018
  */

  var firstTuesday = (from d in DateSequence.FromYear(2012).June()
                    where d.DayOfWeek == DayOfWeek.Tuesday
                    select d).First();

  var lastFriday = (from d in DateSequence.FromYear(2008).March()
                    where d.DayOfWeek == DayOfWeek.Friday
                    select d).Last();

  var saturdays = (from d in DateSequence.FromYear(2013).January()
                   where d.DayOfWeek == DayOfWeek.Saturday
                   select d);

  var thirdFriday = (from d in DateSequence.FromYear(2009).July()
                     where d.DayOfWeek == DayOfWeek.Friday
                     select d).Skip(2).First();

  var nextSaturdays = (from d in DateSequence.FromDates(DateTime.Today, DateTime.Today.AddMonths(3))
                       where d.DayOfWeek == DayOfWeek.Saturday
                       select d);

  var allDays = (from d in DateSequence.FromYear(2018).March()
                 select d);

لا يظهر في هذا المثال هو أنه يمكنك اختيار الحبيبية من استفساراتك. وهذا يعني أنه إذا قمت بذلك:

  var days = (from d in DateSequence.FromYears(2001, 2090).AsYears()
              where d.Year % 2 == 0
              select d.Year).ToList();

سوف تتكرر من خلال التواريخ مع زيادة في السنة. الافتراضي هو Asdays () إذا كنت لا تحدد أي شيء.

المشروع هو Barebone جميلة، ولا توجد اختبارات التعليق أو الوحدة، ولكن آمل أن لا يزال هذا يساعدك. إذا لم يكن كذلك، فهو كانت متعة الكتابة على أي حال :)

هنا مثال على كيفية القيام باليوم الأول من الشهر.

public enum Month
{
    January = 1,
    Febuary = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}

public static Nullable<DateTime> FindTheFirstDayOfAMonth(DayOfWeek dayOfWeek, Month month, int year)
{
    // Do checking of parameters here, i.e. year being in future not past

    // Create a DateTime object the first day of that month
    DateTime currentDate = new DateTime(year, (int)month, 1);

    while (currentDate.Month == (int)month)
    {
        if (currentDate.DayOfWeek == dayOfWeek)
        {
            return currentDate;
        }

        currentDate = currentDate.AddDays(1);
    }

    return null;
}

أنت تسميها مثل

Nullable<DateTime> date = Program.FindTheFirstDayOfAMonth(DayOfWeek.Monday, Month.September, 2009);

إذا قد وصلتك الفكرة. سوف تضطر إلى القيام بوظائف مختلفة تحصل على ما تريد تحقيقه.

YO YO YO - يا رفاق صنع هذا صعب للغاية:

Int DaysinMonth = DateTime.daySinMonth (DateTime.Now.year، DateTime.Now.month)؛

عندما كتبت جدولة، لقد تم نسخ الكثير من خوادم SQL Sysschedules

http://msdn.microsoft.com/en-us/library/ms178644.aspx.

باستخدام أشياء مثل نوع التردد، فاصل التردد، إلخ ... جعلت حقا من السهل حساب القيم في التعليمات البرمجية، لكنني أظن أن هناك رواخ للقيام بذلك من أجلك. أنا أبحث عن ذلك الآن.

نعم، .NET Framework سوف تدعم ذلك دون أي مشاكل؛)

ولكن على محمل الجد - يجب أن تكون قادرا على كتابة التعليمات البرمجية التي تفعل ذلك بسهولة إلى حد ما. إذا لم يكن الأمر كذلك، اطرح سؤالا عندما تتعثر، وسوف نساعد. لكنك لن تحتاج إلى أي تجميعات خارجية - فقط اذهب مع فئة C # القياسية =)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top