Tôi đã Googled rất nhiều và tìm thấy rất nhiều giải pháp, nhưng không ai trong số họ đưa cho tôi số tuần chính xác cho 2012-12-31. Ngay cả ví dụ về MSDN ( liên kết ) cũng thất bại.
2012-12-31 là thứ Hai, do đó sẽ là Tuần 1, nhưng mọi phương pháp tôi đã thử mang lại cho tôi 53. Dưới đây là một số phương pháp mà tôi đã thử:
Từ Thư viện MDSN:
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;
return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
Giải pháp 2:
return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Giải pháp 3:
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;
Cập nhật
Phương pháp sau đây thực sự trả về 1 khi ngày là 2012-12-31. Nói cách khác, vấn đề của tôi là các phương pháp của tôi không tuân theo tiêu chuẩn ISO-8601.
// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
// Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll
// be the same week# as whatever Thursday, Friday or Saturday are,
// and we always get those right
DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
{
time = time.AddDays(3);
}
// Return the week of our adjusted day
return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}