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]) { ......; }
}