2012-01-10 333 views
12

我正在計算日期的計算週數,但System.Globalization.Calendar返回2007年和2012年12月31日(其他年份)的奇數結果。System.Globalization.Calendar.GetWeekOfYear()返回奇數結果

Calendar calendar = CultureInfo.InvariantCulture.Calendar; 
var date = new DateTime(2007, 12, 29); 
for (int i = 0; i < 5; i++) 
{ 
    int w = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    Console.WriteLine("{0}\t{1}", date.ToString("dd.MM.yyyy"), w); 
    date = date.AddDays(1); 
} 

結果

29.12.2007  52 
30.12.2007  52 
31.12.2007  53 <-- 
01.01.2008  1 
02.01.2008  1 

29.12.2012  52 
30.12.2012  52 
31.12.2012  53 <-- 
01.01.2013  1 
02.01.2013  1 

據我瞭解,不應該有一個第53周2007年度和2012年,但日內應包括在1周有什麼辦法在0123中更改此行爲?

+2

「這些日子應該包括在第一週」:根據哪個規則?根據我所知道的規則,今年的最後幾天永遠不會是明年第一週的一部分...... – 2012-01-10 18:59:05

+3

根據ISO 8601。http://en.wikipedia.org/wiki/ISO_8601 – sshow 2012-01-10 19:11:02

+0

順便說一句,爲什麼你使用奇怪的日期格式?我想我從來沒有見過寫作'2007.12.29'的日期。 – svick 2012-01-10 19:13:20

回答

12

documentation for the CalendarWeekRule enumeration明確指出,它「並不直接映射到ISO 8601」 ,並鏈接到ISO 8601 Week of Year format in Microsoft .Net,這是描述差異的博客條目。

+0

這解釋了一切。謝謝 – sshow 2012-01-10 19:31:23

+7

我甚至不想看看解決方法。我的簡單問題是:爲什麼?誰從中受益?爲什麼*略微*改變,以便您必須從十個中選擇兩個日期才能看到差異?有點令人沮喪... – Piddu 2012-12-12 14:15:29

0

不需要52周的周標識符是獨一無二的,你只是不一定有7天在某個特定的一週。

如果這對您是一個問題,然後添加代碼來處理邊緣情況。

1

看一看CalendarWeekRule的值。你正在使用FirstFourDayWeek,所以你得到你描述的值。如果你想每週有7天,你應該使用FirstFullWeek

在你的情況,這將意味着31 12 2007年將只有53歲星期,但等會2 1. 2008年

+1

該解決方案不符合ISO 8601標準,因爲*第一週的大部分時間(四個或更多)年[是第1周] * – sshow 2012-01-10 19:17:10