生成

2016-04-25 64 views
0

我試圖基於以下條件日期列表如下工作的日期列表:生成

  • 如果今天是星期三和之後下午6:00 它是後星期三,然後生成下一個工作周。

  • 否則生成當前工作周。

工作周定義爲星期一至星期五。

因此,從谷歌上搜索,從這裏拉兩個答案到目前爲止,我有這個擴展,它給了我根據當天的下一個出現的指定日:How to get the date of the next Sunday?

我:

public static DateTime Next(this DateTime dt, DayOfWeek startoOfWeek) 
{ 
    var start = (int)dt.DayOfWeek; 
    var target = (int)startoOfWeek; 
    if (target <= start) 
    { 
     target += 7; 
    } 
    return dt.AddDays(target - start); 
} 

從拉也有以下工作日內:

var daysOfWeek = Enum.GetValues(typeof(DayOfWeek)) 
      .OfType<DayOfWeek>() 
      .Skip(1) 
      .TakeWhile(day => day != DayOfWeek.Saturday) 
      .ToList(); 

我開始對它進行測試,例如:

foreach (var day in daysOfWeek) 
{ 
    Debug.WriteLine(DateTime.Now.Next(day).Date.ToString(CultureInfo.CurrentCulture)); 
} 

由於今天是星期天16年4月24日,我拿到下週正確的輸出:

> 4/25/2016 0:00:00 
> 4/26/2016 0:00:00 
> 4/27/2016 0:00:00 
> 4/28/2016 0:00:00 
> 4/29/2016 0:00:00 

但如果今天是星期三說16年4月27日,然後我得到:

> 5/2/2016 0:00:00 
> 5/3/2016 0:00:00 
> 5/4/2016 0:00:00 
> 4/28/2016 0:00:00 
> 4/29/2016 0:00:00 

我越來越近了,但是還是我不知道是否有比我已經做了一個簡單的方法,如果有一個答案在那裏了。

+0

你不似乎正在考慮時間部分 –

回答

0

這看起來有點過分,但我會把它分解成小函數。首先,對於任何日期,給定一週中的某一天,那個工作日的前一個實例(包括當前日期)是什麼? (翻譯 - 給定一個日期,前一個星期一的日期,包括那個日期,如果是星期一?)

然後,對於任何給定的日期和天數,日期的範圍是什麼?

public static class DateFunctions 
{ 
    public static DateTime GetPreviousInstanceOfWeekDay(DateTime forDate, 
     DayOfWeek dayOfWeek) 
    { 
     return forDate.DayOfWeek >= dayOfWeek 
      ? forDate.AddDays(dayOfWeek - forDate.DayOfWeek).Date 
      : forDate.AddDays(-(7-(dayOfWeek - forDate.DayOfWeek))).Date; 
    } 

    public static IEnumerable<DateTime> GetDateRange(DateTime startDate, int length) 
    { 
     return Enumerable.Range(0, length - 1).Select(x => startDate.Date.AddDays(x)); 
    } 
} 

主要的原因是,這是諸如此類的事情,我不希望得到正確的第一次嘗試,並驗證它與幾個單元測試的最簡單的方法。

[TestMethod] 
public void ReturnsPreviousMondayForGivenThursday() 
{ 
    var monday = DateFunctions.GetPreviousInstanceOfWeekDay(DateTime.Parse("4/21/2016"), 
     DayOfWeek.Monday); 
    Assert.AreEqual(DateTime.Parse("4/18/2016"), monday); 
} 

[TestMethod] 
public void ReturnsPreviousSaturdayForGivenSunday() 
{ 
    var saturday = DateFunctions.GetPreviousInstanceOfWeekDay(DateTime.Parse("4/17/2016"), 
     DayOfWeek.Saturday); 
    Assert.AreEqual(DateTime.Parse("4/16/2016"), saturday); 
} 

[TestMethod] 
public void ReturnsSundayForGivenSunday() 
{ 
    var sunday = DateFunctions.GetPreviousInstanceOfWeekDay(DateTime.Parse("4/24/2016"), 
     DayOfWeek.Sunday); 
    Assert.AreEqual(DateTime.Parse("4/24/2016"), sunday); 
} 

這也保持週三/ 6PM檢查與其餘所有分開。這個函數只是結合了其他函數,而它引入的唯一新東西就是檢查它是否應該從前一個星期一或下一個星期一開始返回五天的邏輯。 (我甚至可能把它放在一個單獨的函數中,一些額外的代碼行和一個或兩個單元測試對於安心而言非常有用。)

public static IEnumerable<DateTime> GetWeekDaysForCurrentOrNextWeek(DateTime forDate) 
{ 
    //Badly named variable. It's late. 
    var getStartForWeek = forDate.AddHours(6).DayOfWeek > DayOfWeek.Wednesday 
     ? forDate.AddDays(7) : forDate; 
    return 
     DateFunctions.GetDateRange(
     GetPreviousInstanceOfWeekDay(getStartForWeek, DayOfWeek.Monday), 5); 
} 
0

這個工作對我來說:

public static DateTime GetStartOfWorkWeek(this DateTime now) 
{ 
    var monday = now.AddDays(1 - (int)now.DayOfWeek).Date; 
    if (now.Subtract(monday).TotalHours >= 66.0) 
    // 66.0 hours from Midnight Mon to 6pm Wed 
    { 
     monday = monday.AddDays(7.0); 
    } 
    return monday; 
} 

如果我運行此代碼:

var now1 = new DateTime(2016, 4, 27, 17, 59, 0); 
var now2 = new DateTime(2016, 4, 27, 18, 0, 0); 

var monday1 = now1.GetStartOfWorkWeek(); 
var monday2 = now2.GetStartOfWorkWeek(); 

...我得到這些值:

 
now1 
2016/04/27 17:59 Wednesday 

monday1 
2016/04/25 00:00 Monday 

now2 
2016/04/27 18:00 Wednesday 

monday2 
2016/05/02 00:00 Monday