首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.net中,知道周的数字,我怎样才能得到工作日的日期?

在.net中,知道周的数字,我怎样才能得到工作日的日期?
EN

Stack Overflow用户
提问于 2010-10-04 18:40:52
回答 3查看 5.3K关注 0票数 9

我想在C#中创建一个函数,它将为我返回该周中的日期。

例如,对于第40周,如何获取日期: 4/10、5/10、6/10、7/10、8/10、9/10、10/10。

提前谢谢你!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-04 18:49:54

我认为这应该能做到你想要的:

代码语言:javascript
复制
    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标准,我认为这应该是可行的:

代码语言:javascript
复制
    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();
    }
票数 10
EN

Stack Overflow用户

发布于 2011-03-21 21:21:39

说明

我似乎错过了bug。目前的代码已经在2012-01-30进行了更新,以说明这一事实,我们现在基于周二派生出daysOffset,根据Mikael Svenson的说法,它似乎解决了这个问题。有关详细信息,请参阅此answer

大多数人往往会弄错,我所说的错误是指不符合ISO8601 week date (我们在瑞典经常使用)标准。这个计算有点奇怪,但它归结为.NET中的以下代码:

代码语言:javascript
复制
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)。它首先使用内置的日历建立一月一号(因此此代码可以自定义)。这有点奇怪,因为第53周有时出现在1月份,有时第1周出现在12月。

如果你需要用另一种方式,这不是完全微不足道的,但在.NET中的正确方法在这里展示。

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2012-03-05 20:22:04

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

代码语言:javascript
复制
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;
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3854429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档