2012-04-11 97 views
8

Tôi đã mã sau đây để có được những weeknumber của năm được đưa ra trong thời đối tượng DateTimeTuần trong năm C# Datetime

public static int WeeksInYear(DateTime date) 
    { 
     GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); 
     return cal.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    } 

Bây giờ tôi cung cấp cho các chức năng ngày 2012/1/1 Mà nên trở lại trong tuần 1, nhưng hes trở lại tuần 52. Và tôi dường như không thể hiểu tại sao. Bất cứ ai cũng có một ý tưởng tại sao?

+0

thử với điều này 'cal.GetWeekOfYear (ngày, LịchWeekRule.FirstFourDayWeek, DayOfWeek.Sunday)' – Raghuveer

+0

@RaghuveerGuthikonda: Điều đó sẽ chỉ hoạt động trong trường hợp đặc biệt này. Ví dụ. 1/1/2013 có thể là thứ Bảy, nó sẽ không hoạt động. Nó chỉ là cách lịch tuần được tính toán. 1/1/2012 là trong tuần 52 và nó nên có mặt ở đó. – basti

Trả lời

8

Thuật toán đang thực hiện chính xác những gì bạn đã hướng dẫn thực hiện. Bạn đã đặt CalanderWeekRule thành FirstFourDayWeek. Ngày 1 tháng 1 năm 2012 không phải là một phần của bốn ngày đầu tiên, vì vậy bạn đã hướng dẫn người bình tĩnh bắt đầu đếm từ ngày 2 tháng 1.

Calculate date from week number

0

Tôi cho rằng vì 2012/01/01 là một chủ nhật và GetWeekOfYear nói nó trả về tuần bao gồm ngày, nó trở về tuần cuối cùng của năm 2011 chứ không phải là tuần đầu tiên của năm 2012.

Hãy xem số CalendarRule để biết rõ.

0

1/1/2012 là chủ nhật. Tôi tin rằng đó là lý do tại sao bạn nhận được 52, bởi vì đó là ngày cuối cùng của tuần cuối cùng. Vào ngày 2 tháng 1, bạn sẽ nhận được kết quả đúng.

1

Số tuần được tính toán chính xác. Bạn nên có một đọc về cách tuần thực sự tính/đếm (Wikipedia ?!).

Chú ý: Tính toán số tuần được tích hợp sẵn là lỗi. Microsoft mô tả sự cố trong số KnowledgeBase-Article 200299. Nó có vấn đề với ISO-8601.

1

Bạn có thể sử dụng lớp Tuần của Time Period Library for .NET mà hỗ trợ hỗ trợ các tiêu chuẩn ISO 8601 tuần số:

TimeCalendar calendar = new TimeCalendar(
    new TimeCalendarConfig { YearWeekType = YearWeekType.Iso8601 }); 
Week week = new Week(new DateTime(2012, 01, 01), calendar); 
Console.WriteLine("week #: ", week.WeekOfYear); 
4
public static int WeeksInYear(DateTime date) 
{ 
    GregorianCalendar cal = new GregorianCalendar(GregorianCalendarTypes.Localized); 
    return cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Monday); 

tôi nghĩ rằng nếu thay đổi CalendarWeekRule.FirstFourDayWeek để CalendarWeekRule.FirstDay sau đó điều này sẽ làm việc tốt.

tôi thay đổi điều này sau đó làm việc tốt.

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