I don't understand why the calendar pass from 53 to 2 and not 53 to 1
Nó hoạt động như mong đợi. Cách tính tuần, 3 ngày đầu tiên của năm 2016 được tính là tuần đầu tiên của năm 2016.
Lưu ý rằng điều khiển không thực hiện bất kỳ lịch hoặc hiển thị nào có liên quan. Nó chỉ đơn giản là thay đổi hiển thị kiểu của cửa sổ lịch do Windows cung cấp. Mã nhìn thấy trên trang CP là tất cả những gì và chủ yếu nó chỉ đặt một lá cờ phong cách nói với Windows để thêm số tuần:
style = style | MCS_WEEKNUMBERS;
Mục MSDN cho nó chỉ ra:
Tuần 1 được định nghĩa là tuần đầu tiên có chứa ít nhất bốn ngày.
Kể từ ngày 1-3 tháng 1 không phải là 4 ngày, có vẻ như có lỗi, lịch khác đang được sử dụng hoặc MSDN đã lỗi thời.
Từ nhận xét:
From what i understood, what's wrong is "date format". Maybe it's not a 8601
Không, nó là nhiều hơn thế: ISO8601 là một lịch khác nhau mà không phải của Windows cũng không NET cụ. Wikipedia ghi chú:
Tuần đầu tiên của năm là tuần chứa thứ Năm đầu tiên của năm (và, do đó, luôn chứa 4 tháng 1). Do đó, việc đánh số ISO theo tuần nên hơi lệch từ Gregorian trong một số ngày gần 1 tháng 1.
Đây là những gì bạn thấy trong menu thả xuống lịch.
Alternative
Nhưng Tuần ISO8601 năm rất dễ dàng để tính toán:
Bắt đầu với mã cho GetISOWeekOfYear()
từ my answer to a very similar question. Bạn có thể sử dụng nó để hiển thị tuần ISO8601 của năm cho ngày đã chọn trong nhãn hoặc một cái gì đó bên cạnh DTP.
In số tuần đầu tiên và cuối cùng cho năm 2011 Để 2021:
Dim cal As Calendar = CultureInfo.CurrentCulture.DateTimeFormat.Calendar
For n As Int32 = 2011 To 2017 '2021
dt = New DateTime(n, 12, 21)
Console.WriteLine(" ***** {0} *****", n)
For j = 0 To 3
Dim NetWk = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstD)
Console.WriteLine("Invariant Date: {0} ISO #:{1:00} NET #:{2:00}",
dt.ToString("MM/dd/yyyy"), GetISOWeekOfYear(dt), NetWk)
dt = dt.AddDays(7)
Next
Next
Kết quả cho 2015/2016 phần:
***** 2015 *****
Ngày bất biến: 12/21/2015 ISO #: 52 NET #: 52
Ngày biến đổi: 12/28/2015 ISO #: 53 NET #: 53
Ngày biến thể: 01/04/2016 ISO #: 01 NET # : 02
Ngày bất biến: 01/11/2016 ISO #: 02 NET #: 03
***** 2016 *****
Ngày bất biến: 21/21/2016 ISO #: 51 NET #: 52
Ngày bất biến: 12/28/2016 ISO #: 52 NET #: 53
Ngày biến thể: 01/04/2017 ISO #: 01 NET #: 01
Ngày bất biến: 01/11/2017 ISO #: 02 NET # : 02
Trừ khi bạn sẵn sàng để viết kiểm soát của riêng bạn từ đầu hoặc giấy phép một mà có thể được thiết lập để một cuốn lịch khác nhau (và có một định nghĩa cho ISO8601), đó có thể là tốt nhất mà bạn có thể làm.
Dòng dưới cùng: Số tuần không sai. Nó sử dụng một lịch khác với bạn mong muốn/muốn.
Tài liệu tham khảo:
Có thể bạn nên hỏi điều này trong bảng thảo luận của bài viết riêng vì đây không phải là thành phần mặc định mà là sự phát triển của bên thứ ba. – equisde
Tôi đang cố gắng nhưng đó là một bài viết cũ. Từ những gì tôi hiểu, có gì sai là "định dạng ngày".Có lẽ nó không phải là một lịch của 8601 – user2839159
NET không phải là ISO8601, nhưng có một số tùy chọn lịch để có được một cái gì đó tương tự (và chỉ 1-2 dòng mã để chuyển đổi hoặc mô phỏng). Mã không tính toán WOY, chỉ cần mở một PInvoke để có được NET để làm điều đó. Nếu tôi nhớ lại, tuần đầu tiên của năm là một tuần có chứa thứ Năm. Kể từ 1/1/2016 là thứ Năm, tôi nghĩ nếu bạn chuyển sang tháng tiếp theo, nó sẽ hiển thị Jan 1-2-3 là tuần đầu tiên của năm 2016. – Plutonix