2015-11-03 16 views
5

Tôi gặp sự cố với bộ chọn ngày giờ được mở rộng vbnet của tôi. Khi phần tử chuyển sang năm mới (2016), số tuần được hiển thị bên trái là sai.VB.NET DatetimePicker - Số tuần sai

Wrong week number

Tôi có một "DateTimePicker" mà không phải là thành phần mặc định, nó được tải về tại đây: http://www.codeproject.com/Articles/17063/ExtendedDateTimePicker-control-with-week-numbers

Tôi không hiểu tại sao đèo lịch 53-2 và không 53 đến 1.

Có thể một trong các bạn có cùng lỗi. Cảm ơn bạn đã dành thời gian.

+1

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

+0

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

+1

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

Trả lời

3

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 ( 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:

+0

Bạn nên sử dụng định dạng ngày ISO ('yyyy-MM-dd') trên SO để tránh bất kỳ sự nhầm lẫn khu vực nào. – Enigmativity

1

Việc kiểm soát đang làm việc tốt.

Khi năm thay đổi trong vài ngày cuối cùng của năm là trong tuần 53 - nhưng không phải là một tuần đầy đủ. Tương tự, vài ngày đầu tiên của năm là vào tuần thứ 1, nhưng điều khiển có cài đặt "ngày đầu tiên trong tuần" của hệ thống để xác định khi nào tuần bắt đầu - vì vậy có thể trong tuần đầu tiên của năm 1 đến 7 ngày trong đó.

Điều này có nghĩa là hình ảnh bạn đã hiển thị đang hiển thị Tuần 53 vì bạn đang ở trong tháng 12 và tuần 2 vì tuần thứ 2 của tháng 1 bắt đầu vào ngày 4.

Nếu bạn điều hướng đến tháng nó sẽ hiển thị tuần 1 cho hàng bắt đầu vào ngày 28.

Các mấu chốt là tuần đầu tiên trong tháng chỉ có 3 ngày trong đó.

Đây chỉ là hành vi bình thường và chính xác của điều khiển này.