根據official (gregorian) calendar,2008年12月29日的週數爲1,因爲在第52周的最後一天(即28/12)之後,還有三天或更少天。有點奇怪,但確定,規則就是規則。.NET給了我2008年12月29日錯誤的週數嗎?
所以根據這個日程,我們對2008/2009
- 28/12這些邊界值是每週52
- 29/12是一週1
- 1/1是一週1
- 8/1是2周
C#提供了一個GregorianCalendar類,具有功能GetWeekOfYear(date, rule, firstDayOfWeek)
。
參數rule
是一個具有3個可能值的枚舉:FirstDay, FirstFourWeekDay, FirstFullWeek
。從我的理解我應該去爲FirstFourWeekDay
規則,但我嘗試了所有這些以防萬一。
最後一個參數通知哪一週應該被認爲是一週的第一天,根據那個日曆,它是星期一那麼星期一就是。
所以我啓動了一個快速和骯髒的控制檯應用程序來測試這一點:
using System;
using System.Globalization;
namespace CalendarTest
{
class Program
{
static void Main(string[] args)
{
var cal = new GregorianCalendar();
var firstWeekDay = DayOfWeek.Monday;
var twentyEighth = new DateTime(2008, 12, 28);
var twentyNinth = new DateTime(2008, 12, 29);
var firstJan = new DateTime(2009, 1, 1);
var eightJan = new DateTime(2009, 1, 8);
PrintWeekDays(cal, twentyEighth, firstWeekDay);
PrintWeekDays(cal, twentyNinth, firstWeekDay);
PrintWeekDays(cal, firstJan, firstWeekDay);
PrintWeekDays(cal, eightJan, firstWeekDay);
Console.ReadKey();
}
private static void PrintWeekDays(Calendar cal, DateTime dt, DayOfWeek firstWeekDay)
{
Console.WriteLine("Testing for " + dt.ToShortDateString());
Console.WriteLine("--------------------------------------------");
Console.Write(CalendarWeekRule.FirstDay.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFourDayWeek.ToString() + "\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, firstWeekDay));
Console.Write(CalendarWeekRule.FirstFullWeek.ToString() + "\t\t");
Console.WriteLine(cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, firstWeekDay));
Console.WriteLine("--------------------------------------------");
}
}
}
...這就是我得到
Testing for 28.12.2008
--------------------------------------------
FirstDay 52
FirstFourDayWeek 52
FirstFullWeek 51
--------------------------------------------
Testing for 29.12.2008
--------------------------------------------
FirstDay 53
FirstFourDayWeek 53
FirstFullWeek 52
--------------------------------------------
Testing for 01.01.2009
--------------------------------------------
FirstDay 1
FirstFourDayWeek 1
FirstFullWeek 52
--------------------------------------------
Testing for 08.01.2009
--------------------------------------------
FirstDay 2
FirstFourDayWeek 2
FirstFullWeek 1
--------------------------------------------
所以我們看到,沒有一個組合的上述與官方日曆相匹配(如果你急着,只要看到29/12永遠不會獲得第一週)。
我在這裏發生了什麼問題?也許有一些我很想念的東西? (這是星期五和晚上的工作時間在這裏比利時,忍受着我;))
編輯:也許我應該解釋:我需要的是一個函數適用於任何一年,返回相同的結果作爲我連接的公曆。所以在2008年沒有特別的解決方法。
嗯,可能。如果我在en-cn cultureinfo上修復它,我會看看我是否正確。 – rodbv 2009-01-09 18:01:59
做了一些測試和一些MSDN閱讀:文化用於通知GetWeekOfYear,規則和firstdayofweek的第二和第三個參數。但是,既然我提供這些,文化變得無關緊要。 – rodbv 2009-01-09 18:59:08