2010-10-04 157 views
9

我想在C#中創建一個函數,一個星期的編號會在那一週返回我的日子。在.net中,知道週數如何獲得星期幾日期?

例如,對於第40周,我如何得到日期: 4/10,5/10,6/10,7/10,8/10,9/10,10/10。

預先感謝您!

+0

的[計算從週數日期]可能重複(http://stackoverflow.com/questions/662379/calculate-date-from-week-number) – andreiursan 2013-06-06 15:34:43

回答

8

我想這應該做你想要什麼:

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(); 
    } 
+1

這基本上取決於你在世界上的哪個地方,因爲在歐洲,第一週是第一週有4天,而在美國是1/1(http: //en.wikipedia.org/wiki/Seven-day_week#Week_numbering) - 所以代碼是正確的,除了「基地」可能需要調整。 – veggerby 2010-10-04 10:57:56

+2

據我記得,從一個老年項目,上述代碼將無法正常工作時(8601什麼是在歐洲經常使用)計算,如果基地將被調整(見我的答案)。但是也許這已經改變了.net4。 – HCL 2010-10-04 11:05:36

+0

是的,你是正確的,它不符合ISO標準。可以很容易地調整以符合標準。將把和糾正。 – JDunkerley 2010-10-04 11:19:22

1

我似乎已經錯過了錯誤。當前代碼已更新爲2012-01-30,以說明這一事實,現在我們根據Mikael Svenson根據星期二推導出daysOffset似乎可以解決問題。有關詳細信息,請參見此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; 

它將計算一年(年)的日期,星期數(WW)和星期(d)。它通過首先使用內置日曆建立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; 
} 
1

以下功能將幫助您獲得起價週數日期和年份

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; 
     } 
相關問題