2014-02-13 64 views
1

我有这段代码可以在一周内得到日期。但是这个代码需要星期一作为硬编码。如何使这4行灵活的地方其评论"//Special check for Sunday because acc. to our business week Starts from Monday and DayOfWeek Enum starts from Sunday."星期一从星期一开始如何简化逻辑?

我的意思是可以var计算在一个单一的行,没有其他条件?所以明天如果决定星期天是开始日期,那么不需要做任何改变。

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime weekDate = GetWeekDate(DateTime.Now, DayOfWeek.Friday); 
     Console.WriteLine(weekDate); //prints 14-02-2014 
     Console.ReadLine(); 
    } 

    private static DateTime GetWeekDate(DateTime dt, DayOfWeek dow) 
    { 
     DateTime sow; 
     int var = 0; 
     sow = StartOfWeek(dt); 

     if (dow == 0) //Special check for Sunday because acc. to our business week Starts from Monday and DayOfWeek Enum starts from Sunday. 
      var = 6; 
     else 
      var = (int)dow - 1; 

     return sow.AddDays(var); 

    } 

    public static DateTime StartOfWeek(DateTime dt) 
    { 
     int days = dt.DayOfWeek - DayOfWeek.Monday; //Week Starts from Monday 

     if (days < 0) 
      days += 7; 

     return dt.AddDays(-1 * days).Date; 
    } 
} 
+1

使用全球化的第一天DateTimeFormat –

回答

1

它被称为模运算符 - %(也称为整数除法余数)。例如,(7 + dow - 1) % 7应该给你适当的价值。

要改变周的开始,你只需要改变你减去的值,例如。星期一开始星期,它将为零,从星期一开始它将是1,从星期二开始它将是2((7 + dow - 2) % 7)等

+1

这是余数运算符,**不是**模运算符。他们的意思不同。 '-2%5 = -2'而'-2 mod 5 = 3' – dcastro

+0

@Luaan:我认为这已经成功了。只要检查一切是否正常。 –

+0

@dcastro甚至不要让我开始这件事,这是一个不断努力尝试解释这一点。在任何情况下,modulo只是为非负数定义的,所以你的评论也是错误的。事实上,它在Pascal中的工作是完全不相关的:D – Luaan

0

你可以做什么取决于一个常数,甚至是接受作为参数的商业周的开始,并在计算中使用该值,而不是对其进行硬编码。

相关问题