재우니의 블로그

C# datetime 날짜 클래스 확장하여 다음의 요일 명시하여 날짜 구하기

 

c# datetime 날짜 클래스를 확장하여 사용해 보도록 합니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Univ.BaseFramework.Helpers
{
    /// <summary>
    /// 날짜 핼퍼
    /// 사용법은 소스 제일 하단에 예시 있습니다.
    /// luckshim
    /// </summary>
    public static class DateTimeExtensions
    {
        public static DateTime Next(this DateTime from, DayOfWeek dayOfTheWeek)
        {
            var date = from.Date.AddDays(1);
            var days = ((int)dayOfTheWeek - (int)date.DayOfWeek + 7) % 7;
            return date.AddDays(days);
        }

        public static IReadOnlyList<DateTime> Next(
            this DateTime from,
            params DayOfWeek[] days
        )
        {
            return Next(from, DateCalculationKind.And, days);
        }

        public static IReadOnlyList<DateTime> Next(
            this DateTime from,
            DateCalculationKind calculationKind,
            params DayOfWeek[] days
        )
        {
            if (days == null)
                return new DateTime[0];

            var results = new List<DateTime>();

            // And means, we don't want to duplicate data
            days = calculationKind == DateCalculationKind.And
                ? days.Distinct().ToArray()
                : days;

            DateTime? result = null;
            foreach (var dayOfWeek in days)
            {
                result = calculationKind == DateCalculationKind.And || result is null
                    ? Next(from, dayOfWeek)
                    : Next(result.Value, dayOfWeek);

                results.Add(result.Value);
            }

            return results;
        }
    }

    public enum DateCalculationKind
    {
        /// <summary>
        /// Will uniquely calculate the next day of the
        /// week. This will perform a `distinct` on the
        /// collection of days, and give back a unique result
        /// set with each calculation performed with
        /// the `from` parameter.
        /// </summary>
        And,

        /// <summary>
        /// Will use the previous result to calculate the
        /// next date. This allows for duplicate days of
        /// the week and will be calculated in the order
        /// of the days passed in.
        /// </summary>
        AndThen
    }

}

 

위의 날짜  확장 클래스의 helper 를 사용해 봅니다.

 

1. 지정한 날짜가 금요일이니?

2. 지정한 날짜 기준으로 그 다음의 토요일은 언제니?

3. 지정한 날짜 기준으로 그 다음의 금요일은 언제니?

4. 지정한 날짜 기준으로 그 다음의 토요일과 금요일은 언제니?

5. 지정한 날짜 기준으로 그 다음의 토요일과 다다음의 토요일은 언제니?

 

    // 현재는 금요일 입니다.
    DateTime now = new DateTime(2021, 1, 1);

    //지정한 날짜(21년1월1일)가 금요일이냐?
    if (DayOfWeek.Friday == now.DayOfWeek)
    {
        ......
        ......
    }

    //지정한 날짜(21년1월1일) 그 다음의 토요일은 언제니?
    var result = now.Next(DayOfWeek.Saturday);
    if (new DateTime(2021, 1, 2) == result)
    {
        ......
        ......
    }

    //지정한 날짜(21년1월1일) 그 다음의 금요일은 언제니?
    result = now.Next(DayOfWeek.Friday);
    if (new DateTime(2021, 1, 8) == result)
    {
        ......
        ......
    }

    //지정한 날짜(21년1월1일) 그 다음의 토요일과 금요일을 배열로 담아주세요.
    var resultArr = now.Next(DayOfWeek.Saturday, DayOfWeek.Friday);
    if (resultArr.Count == 2)
    {
        if (new DateTime(2021, 1, 2) == resultArr[0]) {  ......; }
        if (new DateTime(2021, 1, 8) == resultArr[1]) {  ......; }
    }

    //지정한 날짜(21년1월1일) 그 다음의 토요일과 다다음의 토요일을 알려주세요.
    resultArr = now.Next(
                DateCalculationKind.AndThen, DayOfWeek.Saturday, DayOfWeek.Saturday);
    if (resultArr.Count == 2)
    {
        if (new DateTime(2021, 1, 2) == resultArr[0]) {  ......; }
        if (new DateTime(2021, 1, 9) == resultArr[1]) {  ......; }
    }
     

 

참고 사이트 

 

khalidabuhakmeh.com/solve-for-the-next-dayofweek-from-datetime

 

Solve For The Next DayOfWeek From DateTime

Using the DateTime class in .NET we calculate the next occurrence of a day of the week.

khalidabuhakmeh.com