2016-08-30 110 views
0

我有月,年,星期几和星期几,基于我想得到一个日期。我怎样才能做到这一点?以下是我的代码,但我没有得到正确的结果。如何从年,月,星期几和星期几获取日期? C#

我在这里错过了什么?

代码:

internal DateTime? GetDate(int year) // year = 2016 
{ 
    int month; 
    DateTime? date; 

    switch (Type) 
    { 
     case "CALCULATED": 
      month = FixedMonth; // month = 9 
      var firstDayOfWeek = new DateTime(year, month, 1); // firstDayOfWeek = 9/1/2016 12:00:00 AM 
      while (RestaurantSchedule.GetOneBasedDayOfWeek(firstDayOfWeek) <= DayOfWeek) // DayOfWeek = Monday 
      { 
       firstDayOfWeek = firstDayOfWeek.AddDays(1); 
      } 
      date = firstDayOfWeek.AddDays((WeekOfMonth - 1) * 7); // WeekOfMonth = 1, returns date = 9/1/2016 12:00:00 AM 
      if (date.Value.Month > month) 
      { 
       return date.Value.AddDays(-7); 
      } 
      return date; 
     default: 
      return new DateTime?(); 
    } 
} 

public static OneBasedDayOfWeek GetOneBasedDayOfWeek(DateTime date) // date = 9/1/2016 12:00:00 AM 
{ 
    // returns Thursday 
    return (OneBasedDayOfWeek)Enum.Parse(typeof(OneBasedDayOfWeek), date.DayOfWeek.ToString()); 
} 

// OneBasedDayOfWeek uses following enum   
public enum DayOfWeek 
{ 
    None = 0, 
    Sunday = 1, 
    Monday = 2, 
    Tuesday = 3, 
    Wednesday = 4, 
    Thursday = 5, 
    Friday = 6, 
    Saturday = 7 
} 

数据库条目:

HolidayDefinitionId Type   FixedMonth FixedDay DayOfWeek WeekOfMonth Adjustment HolidayName  Enabled 
-------------------- ------------ ----------- ----------- ----------- ----------- ----------- --------------- ------- 
LABOR     CALCULATED 9   0   2   1   0   Labor Day  1 
PRESIDENTS   CALCULATED 2   0   2   3   0   President's Day 1 

实际结果:

Presidents Day = 02/15/2016 
Labor Day = 09/01/2016 

预期结果:

Presidents Day = 02/16/2016 
Labor Day = 09/05/2016 
+0

是'WeekOfMonth'不够好界定?劳动节“的第一个星期一”在九月。如果9月一个星期二开始,那么劳动节是在那个月的第二个星期,不是吗?但是如果一年九月从星期日开始,那将是本月的第一周。 – Quantic

+0

什么是OneBasedDayOfWeek? – Kolichikov

+0

@Kolichikov'使用OneBasedDayOfWeek = KI.TAS.DomainObjects.Day.DayOfWeek;'基本上使用所声明的枚举值。 – CSharper

回答

1

今年的总统日是在2月15日,所以这是正确的。 我得到了这样的劳动节: 对于第一部分,我不得不假设你想将微软DateTime(星期日= 0)翻译成你的Sunday = 1枚举。

public static DayOfWeek GetOneBasedDayOfWeek(DateTime date) // date = 9/1/2016 12:00:00 AM 
    { 
     // returns Thursday 
     return (DayOfWeek)((int)date.DayOfWeek + 1); 
    } 

而在你的主要功能,你想迭代,直到你实际上已经达到了你一周中的哪一天,不只是当它是以下(一旦你达到星期天,你的循环就会停止,因为(int)Sunday < (int)AnyOtherDay

while (GetOneBasedDayOfWeek(firstDayOfWeek) != DayOfWeek) 

我的日期几年的道路测试,这和它似乎工作。

+0

也适用于我。我尝试了剩余的假期,并获得确切的价值。 – CSharper