2012-01-10 33 views
12

Tôi đang tính số tuần cho các ngày, nhưng System.Globalization.Calendar trả về kết quả lẻ cho (trong số các năm khác) 31 tháng 12 năm 2007 và 2012.System.Globalization.Calendar.GetWeekOfYear() trả về kết quả lẻ

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); 
} 

Kết quả

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 

theo như tôi hiểu, không nên có một tuần 53 trong năm 2007 và 2012, nhưng những ngày nên được bao gồm trong tuần 1. có cách nào để thay đổi hành vi này trong Calendar?

+2

"Những ngày được cho là được đưa vào tuần 1": theo quy tắc nào? Theo các quy tắc tôi biết, những ngày cuối cùng của năm không bao giờ là một phần của tuần đầu tiên của năm tiếp theo ... –

+3

Theo ISO 8601. http://en.wikipedia.org/wiki/ISO_8601 – sshow

+0

BTW, tại sao bạn có đang sử dụng định dạng ngày kỳ lạ đó không? Tôi nghĩ rằng tôi chưa bao giờ thấy những ngày được viết là '2007.12.29'. – svick

Trả lời

12

Các documentation for the CalendarWeekRule enumeration đặc biệt nói rằng nó "không có bản đồ trực tiếp đến ISO 8601" và liên kết đến ISO 8601 Week of Year format in Microsoft .Net, một mục blog mô tả sự khác biệt.

+0

Điều này giải thích mọi thứ. Cảm ơn – sshow

+7

Tôi thậm chí không muốn xem giải pháp thay thế. Câu hỏi đơn giản của tôi là: Tại sao? Ai được hưởng lợi từ nó? Tại sao * hơi * thay đổi để bạn phải chọn hai ngày trong số mười ngày để thấy sự khác biệt? Một chút bực bội ... – Piddu

0

Không cần phải có 52 tuần để nhận dạng tuần là duy nhất, bạn chỉ không nhất thiết phải có 7 ngày trong một tuần cụ thể.

Nếu đây là vấn đề với bạn thì hãy thêm mã để xử lý vỏ cạnh.

1

Hãy xem các giá trị của CalendarWeekRule. Bạn đang sử dụng FirstFourDayWeek và vì vậy bạn đang nhận được các giá trị bạn mô tả. Nếu bạn muốn mỗi tuần có chính xác 7 ngày, bạn nên sử dụng FirstFullWeek.

Trong trường hợp của bạn, điều đó có nghĩa là 31. 12. 2007 sẽ là tuần 53, nhưng như vậy sẽ 2. 1. 2008.

+1

Giải pháp đó không tuân thủ ISO 8601, vì * tuần đầu tiên với phần lớn (bốn hoặc nhiều) ngày trong phần bắt đầu năm [là tuần 1] * – sshow

Các vấn đề liên quan