using System;
using System.Linq;
using System.Globalization;
public class Test {
public static void Main() {
Calendar calendar = new GregorianCalendar();
int weekNumber = 10;
for (int year = 1900; year < 2012; ++year) {
DateTime blue = calendar.GetFirstDayDateOfWeek(CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday, weekNumber, year);
DateTime sehn = calendar.GetDateOfWeekNumber(DayOfWeek.Monday, weekNumber, year);
Display(blue, "Bluedeep");
Display(sehn, "Sehnsucht");
Console.WriteLine();
}
}
public static void Display(DateTime dt, string owner) {
Console.WriteLine("{0}:\t{1:MM/dd/yyyy (dddd)}", owner, dt);
}
}
public static class CalendarExtension {
#region Bluedeep's code
public static DateTime GetFirstDayDateOfFirstWeek(this Calendar calendar, CalendarWeekRule weekRule, DayOfWeek dayOfWeek, int year) {
DateTime dtFirstDayFirstWeek = DateTime.MinValue;
for (int iWeek = 0, iDay = 1; iWeek != 1; ++iDay) {
dtFirstDayFirstWeek = new DateTime(year, 1, iDay);
iWeek = calendar.GetWeekOfYear(dtFirstDayFirstWeek, weekRule, dayOfWeek);
}
return dtFirstDayFirstWeek;
}
public static DateTime GetFirstDayDateOfWeek(this Calendar calendar, CalendarWeekRule weekRule, DayOfWeek dayOfWeek, int iWeek, int year) {
if (iWeek <= 0) throw new ArgumentOutOfRangeException("Week ne peut pas ĂȘtre <= 0");
DateTime dtFirstDayFirstWeek = GetFirstDayDateOfFirstWeek(calendar, weekRule, dayOfWeek, year);
return calendar.AddWeeks(dtFirstDayFirstWeek, iWeek - 1);
}
#endregion
#region Sehnsucht's code
public static DateTime GetDateOfWeekNumber(this Calendar calendar, DayOfWeek dayOfWeek, int weekNumber, int year) {
DateTime firstDayYear = new DateTime(year, 1, 1);
int diff = (int)dayOfWeek - (int)firstDayYear.DayOfWeek;
DateTime closestChosenDay = firstDayYear.AddDays(diff);
return calendar.AddWeeks(closestChosenDay, weekNumber);
}
#endregion
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CgpwdWJsaWMgY2xhc3MgVGVzdCB7CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkgewoJCUNhbGVuZGFyIGNhbGVuZGFyID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CgkJaW50IHdlZWtOdW1iZXIgPSAxMDsKCQkKCQlmb3IgKGludCB5ZWFyID0gMTkwMDsgeWVhciA8IDIwMTI7ICsreWVhcikgewoJCQlEYXRlVGltZSBibHVlID0gY2FsZW5kYXIuR2V0Rmlyc3REYXlEYXRlT2ZXZWVrKENhbGVuZGFyV2Vla1J1bGUuRmlyc3RGb3VyRGF5V2VlaywgRGF5T2ZXZWVrLk1vbmRheSwgd2Vla051bWJlciwgeWVhcik7CgkJCURhdGVUaW1lIHNlaG4gPSBjYWxlbmRhci5HZXREYXRlT2ZXZWVrTnVtYmVyKERheU9mV2Vlay5Nb25kYXksIHdlZWtOdW1iZXIsIHllYXIpOwoJCQlEaXNwbGF5KGJsdWUsICJCbHVlZGVlcCIpOwoJCQlEaXNwbGF5KHNlaG4sICJTZWhuc3VjaHQiKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKCQl9Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBEaXNwbGF5KERhdGVUaW1lIGR0LCBzdHJpbmcgb3duZXIpIHsKCQlDb25zb2xlLldyaXRlTGluZSgiezB9Olx0ezE6TU0vZGQveXl5eSAoZGRkZCl9Iiwgb3duZXIsIGR0KTsKCX0KfQoKcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhckV4dGVuc2lvbiB7CiNyZWdpb24gQmx1ZWRlZXAncyBjb2RlCglwdWJsaWMgc3RhdGljIERhdGVUaW1lIEdldEZpcnN0RGF5RGF0ZU9mRmlyc3RXZWVrKHRoaXMgQ2FsZW5kYXIgY2FsZW5kYXIsIENhbGVuZGFyV2Vla1J1bGUgd2Vla1J1bGUsIERheU9mV2VlayBkYXlPZldlZWssIGludCB5ZWFyKSB7CgkJRGF0ZVRpbWUgZHRGaXJzdERheUZpcnN0V2VlayA9IERhdGVUaW1lLk1pblZhbHVlOwoJCWZvciAoaW50IGlXZWVrID0gMCwgaURheSA9IDE7IGlXZWVrICE9IDE7ICsraURheSkgewoJCQlkdEZpcnN0RGF5Rmlyc3RXZWVrID0gbmV3IERhdGVUaW1lKHllYXIsIDEsIGlEYXkpOwoJCQlpV2VlayA9IGNhbGVuZGFyLkdldFdlZWtPZlllYXIoZHRGaXJzdERheUZpcnN0V2Vlaywgd2Vla1J1bGUsIGRheU9mV2Vlayk7CgkJfQoJCXJldHVybiBkdEZpcnN0RGF5Rmlyc3RXZWVrOwoJfQogCglwdWJsaWMgc3RhdGljIERhdGVUaW1lIEdldEZpcnN0RGF5RGF0ZU9mV2Vlayh0aGlzIENhbGVuZGFyIGNhbGVuZGFyLCBDYWxlbmRhcldlZWtSdWxlIHdlZWtSdWxlLCBEYXlPZldlZWsgZGF5T2ZXZWVrLCBpbnQgaVdlZWssIGludCB5ZWFyKSB7CgkJaWYgKGlXZWVrIDw9IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIldlZWsgbmUgcGV1dCBwYXMgw6p0cmUgPD0gMCIpOwoJCURhdGVUaW1lIGR0Rmlyc3REYXlGaXJzdFdlZWsgPSBHZXRGaXJzdERheURhdGVPZkZpcnN0V2VlayhjYWxlbmRhciwgd2Vla1J1bGUsIGRheU9mV2VlaywgeWVhcik7CgkJcmV0dXJuIGNhbGVuZGFyLkFkZFdlZWtzKGR0Rmlyc3REYXlGaXJzdFdlZWssIGlXZWVrIC0gMSk7Cgl9CiNlbmRyZWdpb24KCiNyZWdpb24gU2VobnN1Y2h0J3MgY29kZQoJcHVibGljIHN0YXRpYyBEYXRlVGltZSBHZXREYXRlT2ZXZWVrTnVtYmVyKHRoaXMgQ2FsZW5kYXIgY2FsZW5kYXIsIERheU9mV2VlayBkYXlPZldlZWssIGludCB3ZWVrTnVtYmVyLCBpbnQgeWVhcikgewoJCURhdGVUaW1lIGZpcnN0RGF5WWVhciA9IG5ldyBEYXRlVGltZSh5ZWFyLCAxLCAxKTsKCQlpbnQgZGlmZiA9IChpbnQpZGF5T2ZXZWVrIC0gKGludClmaXJzdERheVllYXIuRGF5T2ZXZWVrOwoJCURhdGVUaW1lIGNsb3Nlc3RDaG9zZW5EYXkgPSBmaXJzdERheVllYXIuQWRkRGF5cyhkaWZmKTsKCQkKCQlyZXR1cm4gY2FsZW5kYXIuQWRkV2Vla3MoY2xvc2VzdENob3NlbkRheSwgd2Vla051bWJlcik7Cgl9CiNlbmRyZWdpb24KfQ==