知道周数的第一天和最后一天的日期

我需要知道一周的第一天和最后一天的日期,知道周数。

我得到一个开始日期和结束日期,代表给定年份中选定周的第一天和最后一天。 那么我需要得到上一年同一周的开始日期和结束日期来对一些数据进行图形比较。

我设法根据给定的开始日期和结束日期获得周数。 现在我需要获取前一年同一周的第一天和最后一天的日期。 我怎么能最快地做到这一点?

编辑:这是我得到周数的方式:

private int GetWeekNumber(DateTime date) { GregorianCalendar calendar = new GregorianCalendar(GregorianCalendarTypes.USEnglish); return calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); } 

您可以使用以下两种方法根据给定年份计算给定周数的周数和开始日期:

 // this method is borrowed from http://stackoverflow.com/a/11155102/284240 public static int GetIso8601WeekOfYear(DateTime time) { DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time); if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) { time = time.AddDays(3); } return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); } public static DateTime FirstDateOfWeek(int year, int weekOfYear, System.Globalization.CultureInfo ci) { DateTime jan1 = new DateTime(year, 1, 1); int daysOffset = (int)ci.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek; DateTime firstWeekDay = jan1.AddDays(daysOffset); int firstWeek = ci.Calendar.GetWeekOfYear(jan1, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek); if ((firstWeek <= 1 || firstWeek >= 52) && daysOffset >= -3) { weekOfYear -= 1; } return firstWeekDay.AddDays(weekOfYear * 7); } 

然后您可以通过以下方式获取两个日期:

 // 46 int thisWeekNumber = GetIso8601WeekOfYear(DateTime.Today); // 11/11/2013 DateTime firstDayOfWeek= FirstDateOfWeek(2013, thisWeekNumber, CultureInfo.CurrentCulture); // 11/12/2012 DateTime firstDayOfLastYearWeek = FirstDateOfWeek(2012, thisWeekNumber, CultureInfo.CurrentCulture); 

添加6天即可获得本周结束。

这是我的解决方案:

 public static DateTime FirstDayOfWeek(DateTime date) { DayOfWeek fdow = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; int offset = fdow - date.DayOfWeek; DateTime fdowDate = date.AddDays(offset); return fdowDate; } public static DateTime LastDayOfWeek(DateTime date) { DateTime ldowDate = FirstDayOfWeek(date).AddDays(6); return ldowDate; } 

上述方法计算2016年第1周的第一个错误日期。

固定代码基于以前的答案

  public DateTime FirstDateOfWeek( int year, int weekOfYear) { var newYear = new DateTime(year, 1, 1); var weekNumber = newYear.GetIso8601WeekOfYear(); DateTime firstWeekDate; if (weekNumber != 1) { var dayNumber = (int) newYear.DayOfWeek; firstWeekDate = newYear.AddDays(7 - dayNumber + 1); } else { var dayNumber = (int)newYear.DayOfWeek; firstWeekDate = newYear.AddDays(-dayNumber + 1); } if (weekOfYear == 1) { return firstWeekDate; } return firstWeekDate.AddDays(7 * (weekOfYear - 1)); } 

再加上测试

  [TestCase(2016, 1, 2016, 1, 4)] [TestCase(2016, 2, 2016, 1, 11)] [TestCase(2016, 52, 2016, 12, 26)] [TestCase(2014, 1, 2013, 12, 30)] public void FirstDateOfWeek_ShouldReturnCorrectDay(int year, int weekNumber, int correctYear, int correctMonth, int correctDay) { var helper = new DateHelper(); var result = helper.FirstDateOfWeek(year, weekNumber); Assert.That(result.Year, Is.EqualTo(correctYear)); Assert.That(result.Month, Is.EqualTo(correctMonth)); Assert.That(result.Day, Is.EqualTo(correctDay)); } 

从原始DateTime中减去1年,然后再次调用GetWeekNumber方法。

 TimeSpan oneYear = dateTime.AddYears(1) - dateTime; var lastYearWeekNumber = GetWeekNumber(dateTime.Subtract(oneYear)); 
  private static DateTime FirstDateOfWeek(int year, int weekOfYear) { var firstDate = new DateTime(year, 1, 4); //first thursday of the week defines the first week (https://en.wikipedia.org/wiki/ISO_8601) //Wiki: the 4th of january is always in the first week while (firstDate.DayOfWeek != DayOfWeek.Monday) firstDate = firstDate.AddDays(-1); return firstDate.AddDays((weekOfYear - 1)*7); } 

更轻松,更高效的解决方案!

由于每周有7天,你会知道第10周与第71-77天相同。你知道每个月的天数(不要忘记闰年)。 构建确切的日期然后,您可以获得有关那些日子的信息。

Tim Schmelter的方法不适用于周一开始数周的瑞典(sv-SE)文化。 这已经使用en-US和sv-SE进行了测试。

  public static DateTime GetFirstDateOfWeek(int year, int weekOfYear, CultureInfo cultureInfo) { DateTime jan1 = new DateTime(year, 1, 1); int daysOffset = (int)cultureInfo.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek; DateTime firstWeekDay = jan1.AddDays(daysOffset); int firstWeek = cultureInfo.Calendar.GetWeekOfYear(jan1, cultureInfo.DateTimeFormat.CalendarWeekRule, cultureInfo.DateTimeFormat.FirstDayOfWeek); if (firstWeek == 1) { weekOfYear -= 1; } return firstWeekDay.AddDays(weekOfYear * 7); }