代码之家  ›  专栏  ›  技术社区  ›  user171910

在.NET中,知道周数如何获取工作日日期?

  •  9
  • user171910  · 技术社区  · 15 年前

    我想在C中创建一个函数,对于一周的数字,它将返回该周的天数。

    例如,对于第40周,我如何获得天数: 4/10、5/10、6/10、7/10、8/10、9/10、10/10。

    提前谢谢!

    3 回复  |  直到 15 年前
        1
  •  9
  •   JDunkerley    15 年前

    我认为这应该是你想要的:

        public static DateTime[] WeekDays(int Year, int WeekNumber)
        {
            DateTime start = new DateTime(Year, 1, 1).AddDays(7 * WeekNumber);
            start = start.AddDays(-((int)start.DayOfWeek));
            return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray();
        }
    

    虽然我把星期天视为一周中的第一天,但如果你想把星期一视为第一天,可以将范围从(0,7)改为(1,7)。

    如果你想符合ISO标准,我认为这应该是可行的:

        public static DateTime[] WeekDays(int Year, int WeekNumber)
        {
            DateTime start = new DateTime(Year, 1, 4);
            start = start.AddDays(-((int)start.DayOfWeek));
            start = start.AddDays(7 * (WeekNumber - 1));
            return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray();
        }
    
        2
  •  1
  •   Community Mohan Dere    9 年前

    注释

    我好像错过了虫子。目前的代码已更新到2012-01-30,以说明这一事实,我们现在得出 daysOffset 根据星期二 Mikael Svenson 似乎解决了问题。看到这个 answer 详情。

    大多数人都会犯这种错误,我的意思是不符合ISO8601周日期标准(我们在瑞典经常使用这个标准)。这个计算有点奇怪,但可以归结为.NET中的以下代码:

    DateTime jan1 = new DateTime(yyyy, 1, 1);
    
    int daysOffset = DayOfWeek.Tuesday - jan1.DayOfWeek;
    
    DateTime firstMonday = jan1.AddDays(daysOffset);
    
    var cal = CultureInfo.CurrentCulture.Calendar;
    
    int firstWeek = cal.GetWeekOfYear(jan1, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    
    var weekNum = ww;
    
    if (firstWeek <= 1)
    {
        weekNum -= 1;
    }
    
    var result = firstMonday.AddDays(weekNum * 7 + d - 1);
    
    return result;
    

    它将计算一年的日期(YYYY)、周数(WW)和星期几(D)。它首先使用内置日历建立1月1日(以便可以自定义此代码)。这有点奇怪,因为第53周有时发生在1月,有时第1周发生在12月。

    如果您需要换一种方式,这并不完全是琐碎的,但是在.NET中显示的是正确的方法。

    var c = CultureInfo.CurrentCulture.Calendar;
    
    // `FromDayOfWeek` fixes problem with the enumeration
    // not based on Monday being the first day of the week
    d = (byte)FromDayOfWeek(c.GetDayOfWeek(t));
    switch (d)
    {
        case 1:
        case 2:
        case 3:
            // see this for details
            // http://blogs.msdn.com/shawnste/archive/2006/01/24/iso-8601-week-of-year-format-in-microsoft-net.aspx
            t = t.AddDays(3);
            break;
    }
    
    ww = (byte)c.GetWeekOfYear(t, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    
    // Adjust year when week 53 occurs in January or week 1 occurs in December 
    if (ww == 53 && t.Month == 1)
    {
        yyyy = (short)(t.Year - 1);
    }
    else if (ww == 1 && t.Month == 12)
    {
        yyyy = (short)(t.Year + 1);
    }
    else
    {
        yyyy = (short)t.Year;
    }
    
        3
  •  1
  •   user247702    14 年前

    以下函数将帮助您从周数和年中获取开始日期

    public DateTime GetFirstDayFromWeekNumber(int weekNumber, int weekYear)
            {
                DateTime beginingYear = new DateTime(weekYear, 1, 1);
                DateTime finalDate = new DateTime();
                int maxDayOfWeek = (int)DayOfWeek.Saturday;
                int yearStartDay = (int)beginingYear.DayOfWeek;
                int dayDeference = maxDayOfWeek - yearStartDay;
    
                if (weekNumber == 1)
                {
                    finalDate = beginingYear.AddDays(-yearStartDay);
                }
                else if (weekNumber == 2)
                {
                    finalDate = beginingYear.AddDays((dayDeference + 1));
                }
                else if (weekNumber > 2 && weekNumber <= 53)
                {
                    finalDate = beginingYear.AddDays((dayDeference + 1) + ((weekNumber - 2)* 7));
                }
                return finalDate;
            }
    
    推荐文章