代码之家  ›  专栏  ›  技术社区  ›  Paul D'Ambra

有没有更有效的方法可以在C语言中得到给定日期的前一个星期一?#

  •  3
  • Paul D'Ambra  · 技术社区  · 14 年前

    所以我有一个应用程序需要有一个日期焦点,这样它才能正常运行。给定一个特定的日期来关注它需要知道它在哪一周。我正在根据星期一的日期计算星期。我想知道我对周一的关注是否过度了。

    public static DateTime PreviousMonday(this DateTime dt)
    {
        var dateDayOfWeek = (int)dt.DayOfWeek;
        if (dateDayOfWeek==0)
        {
            dateDayOfWeek = dateDayOfWeek + 7; 
        }
        var alterNumber = dateDayOfWeek - ((dateDayOfWeek*2)-1);
    
        return dt.AddDays(alterNumber);
    }
    
    /// <summary>
    /// Personal tax week starts on the first Monday after the week with 6th April in unless 6th April is a Monday in 
    /// which case that starts the first week. In a leap year this means you can have a week 53 which due to the mod 4 approach of calculating 
    /// flexi week means you get a 5 week flexi period.
    /// As such this method forces the weeks into the range 1 - 52 by finding the week number for the week containing 6th April and
    /// the number for the current week. Treating the 6th April week as week 1 and using the difference to calculate the tax week.
    /// </summary>
    public static int GetTaxWeek(this DateTime dt)
    {
        var startTaxYear = GetActualWeekNumber(new DateTime(DateTime.Now.Year, 4, 6));
        var thisWeekNumber = GetActualWeekNumber(dt);
        var difference = thisWeekNumber - startTaxYear;
        return difference < 0 ? 53 + difference : difference + 1;
    }
    
    private static int GetActualWeekNumber(DateTime dt)
    {
        var ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        var cal = ci.Calendar;
        var calWeekRule = ci.DateTimeFormat.CalendarWeekRule;
        var fDoW = ci.DateTimeFormat.FirstDayOfWeek;
        return cal.GetWeekOfYear(dt, calWeekRule, fDoW);
    }
    
    public static int PeriodWeek(this DateTime dt)
    {
        var rawPeriodWeek = GetTaxWeek(dt) % 4;
        return rawPeriodWeek == 3 ? 1 : rawPeriodWeek + 2;
    }
    

    }

    系统从第一个纳税周开始运行一个滚动的4周计划,并且需要根据计划中的位置采取不同的行为。所以你可以看到…

    1. 从用户那里获取日期(比如 userDate )
    2. 呼叫 userDate=userDate.PreviousMonday(); 到星期一 给定-周末在哪
    3. 呼叫 userDate.PeriodWeek(); 然后得到 从1到4的时间段。

    GetTaxWeek是公共的,因为它在其他地方使用…我还替换了日期,因为它被使用了不止一次,我不想记住更改它不止一次。

    我能看看树林里的树吗?或者有没有一种更无错误的方法可以做到这一点。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Øyvind Bråthen    14 年前

    我认为您可以使用 GregorianCalendar 里面 System.Globalization . 在这里,您可以获得给定日期的周数,如下所示:

    GregorianCalendar gc = new GregorianCalendar(); 
    int weekno = gc.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    

    在这里,你可以给出如何根据当地规则计算周数的规则。和挪威一样,我们的第一个星期是星期一,一年中的第一个星期是有四天或更多天的第一个星期。将此设置为特定于区域性的规则,以获取正确的周数。

    您的某些特定处理方法仍然需要手工完成,但至少可以使用此方法来消除一些混乱:)

        2
  •  0
  •   Anurag    14 年前

    你为什么不使用 DateTimePicker 控制?它将告诉您用户所选日期的日期。然后你可以简单地从中减去天数,得到星期一的日期。例如: 我用的是 日期输入框 控件并将其命名为dtptemp。使用的事件是

    dtpTemp_ValueChanged()
    

    dtpTemp.Value.DayOfWeek -会给你一天:星期二、星期三、星期四等。

    然后您可以相应地将以下代码与开关盒一起使用:

    dtpTemp.Value.AddDays(num); 为了得到星期一的日期

    这里num将具有-ve值,这取决于上面计算的日期。值:星期二为-1,星期三为-2,星期四为-3,依此类推。

    此外,使用DateTimePicker还会对UI本身产生积极影响。