Theo số official (gregorian) calendar, số tuần trong ngày 29/12/2008 là 1, bởi vì sau ngày cuối cùng của tuần 52 (tức là 28/12), có ba hoặc ít ngày còn lại trong năm. Kinda lạ, nhưng OK, quy tắc là các quy tắc..NET có cho tôi số tuần sai trong ngày 29 tháng 12 năm 2008 không?
Vì vậy, theo lịch này, chúng ta có những giá trị ranh giới cho 2008/2009
- 28/12 là tuần 52
- 29/12 là tuần 1
- 1/1 là tuần 1
- 8/1 là tuần 2
C# cung cấp một lớp GregorianCalendar, mà có một chức năng GetWeekOfYear(date, rule, firstDayOfWeek)
.
Tham số rule
là một liệt kê có 3 giá trị có thể: FirstDay, FirstFourWeekDay, FirstFullWeek
. Từ những gì tôi đã hiểu tôi nên đi cho các quy tắc FirstFourWeekDay
, nhưng tôi đã thử tất cả chúng chỉ trong trường hợp.
Tham số cuối cùng thông báo ngày trong tuần nào sẽ được xem là ngày đầu tiên của tuần, theo lịch đó là thứ Hai, thứ Hai đến thứ Hai.
Vì vậy, tôi bắn ra một giao diện điều khiển ứng dụng nhanh chóng và dơ bẩn để kiểm tra điều này:
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("--------------------------------------------");
}
}
}
... và đây là những gì tôi có được
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
--------------------------------------------
Vì vậy, như chúng ta thấy, không ai trong số các kết hợp trên phù hợp với lịch chính thức (nếu bạn đang vội vàng, chỉ thấy rằng 29/12 không bao giờ được tuần # 1).
Tôi đang gặp vấn đề gì ở đây? Có lẽ có cái gì đó rõ ràng mà tôi đang thiếu? (đó là thứ Sáu và giờ làm việc muộn ở đây tại Bỉ, chịu với tôi;))
Edit: Có lẽ tôi nên giải thích: những gì tôi cần là một chức năng hoạt động cho bất cứ năm nào, trả lại kết quả tương tự như lịch gregorian tôi liên kết . Vì vậy, không có cách giải quyết đặc biệt nào cho năm 2008.
hmm ... MS không tuân theo các tiêu chuẩn? Tôi bị sốc. – rmeador
Tìm kiếm đầy hứa hẹn :) tiếc là tôi không thể kiểm tra điều này ngay bây giờ, nhưng tôi sẽ làm điều đó vào ngày mai. – rodbv
rmeador: từ những gì tôi đã thấy Java có cùng một vấn đề ... – rodbv