我有两个DateTime变量,我需要计算它们之间的周数。
最快(也是正确)的方式是什么?
答案 0 :(得分:30)
使用TimeSpan
:
double weeks = (date1 - date2).TotalDays / 7;
答案 1 :(得分:3)
您可以尝试以下方法:
DateTime d1 = new DateTime(2006,10,1);
DateTime d2 = new DateTime(2007,10,15);
TimeSpan tt = d2 - d1;
int totalWeeks = tt.Days/7;
如果你想要分数的确切差异,那么代替:
int totalWeeks = tt.Days/7;
使用:
double totalWeeks = tt.TotalDays/7;
答案 2 :(得分:3)
更新:试用此库:http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET 作者已经找到了解决所有这些细节的方法。
我没有看到真正定义周的答案。
这里存在陷阱,并非所有周都是平等的。有些计算星期一,而其他人计算星期四。
以本月为例。如果我想计算2012年8月的周数,我可以做类似的事情:
var date1 = new DateTime(2012,8,1);
var date2 = new DateTime(2012,8,31);
var weeks = (date1 - date2).TotalDays / 7;
首先,.TotalDays给了我们一个双倍的: 周== 4.2857 ......
我们可以绕圈,但有时你会超过数。其他时候你不及格。
计算周数通常依赖于定义一周开始和结束的时间。使用DateTime对象,我们每周都会在星期一开始查找。
广泛使用的ISO8601标准定义从星期四开始的一周。所以两个日期之间的周数取决于星期四的发生次数。
使用GregorianCalendar类实现类似的东西:
using System;
using System.Globalization;
using FluentAssertions;
using NUnit.Framework;
//...Namespace, test fixture class, etc ...
[Test]
public void GetMetricsTimesBetween_ReturnsCorrectRange() {
DateTime startDate = new DateTime(2012, 8, 1);
DateTime endDate = new DateTime(2012, 8, 31);
var cal = new GregorianCalendar();
int startWeekNumber = cal.GetWeekOfYear(startDate,
CalendarWeekRule.FirstDay,
DayOfWeek.Thursday);
int endWeekNumber = cal.GetWeekOfYear(endDate,
CalendarWeekRule.FirstDay,
DayOfWeek.Thursday);
int numberOfWeeksInRange = endWeekNumber - startWeekNumber;
numberOfWeeksInRange.Should().Be(5);
}
这应该会给你更可靠的结果。您必须考虑这个例子假设我们在同一年内计算了数周。通过一些额外的工作,您可以帮助计算处理跨越不同年份的日期范围:
[Test]
public void GetCountOfWeeks() {
var startDate = new DateTime(2012, 12, 1); // 4 weeks here
var endDate = new DateTime(2014, 1, 10); // 52 in 2013 and 2 weeks in 2014
int numberOfWeeksInRange = 0;
var cal = new GregorianCalendar();
for (int year = startDate.Year; year <= endDate.Year; year++)
{
int startWeekNumber = 0;
int endWeekNumber= 0;
if(year == startDate.Year) { // start date through the end of the year
startWeekNumber = cal.GetWeekOfYear(startDate,
CalendarWeekRule.FirstDay, DayOfWeek.Thursday);
endWeekNumber = cal.GetWeekOfYear((
new DateTime(year + 1, 1, 1).AddDays(-1)),
CalendarWeekRule.FirstDay, DayOfWeek.Thursday);
} else if(year == endDate.Year) { // start of the given year through the end date
startWeekNumber = cal.GetWeekOfYear((new DateTime(year, 1, 1)),
CalendarWeekRule.FirstDay, DayOfWeek.Thursday);
endWeekNumber = cal.GetWeekOfYear(endDate,
CalendarWeekRule.FirstDay, DayOfWeek.Thursday);
} else { // calculate the number of weeks in a full year
startWeekNumber = cal.GetWeekOfYear(new DateTime(year, 1, 1),
CalendarWeekRule.FirstDay, DayOfWeek.Thursday);
endWeekNumber = cal.GetWeekOfYear((
new DateTime(year + 1, 1, 1).AddDays(-1)),
CalendarWeekRule.FirstDay, DayOfWeek.Thursday);
}
numberOfWeeksInRange += endWeekNumber - startWeekNumber;
}
numberOfWeeksInRange.Should().Be(58);
}
这仍然不是完美的,但它更接近。这里的要点是,如果你想得到一个类似于&#34;周&#34;的真实数字,它并不像我们倾向于那样简单。这比一些标准的科学表达式(如1 + 1 = 2)更像是一个特定于语言环境的决定。将总天数除以7就像说所有&#34;工作日&#34;一样模棱两可。是9到5 ......
这是一个更好的例子。当然,仍然可以使用重构,但是在同一年和跨越多年的日期范围处理GregorianCalendar类的扩展:
/// <summary>
/// Returns the number of weeks between two datetimes
/// </summary>
/// <param name="cal"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public static int GetWeeks(this GregorianCalendar cal,
CalendarWeekRule weekRule,
DayOfWeek dayofWeek,
DateTime startDate,
DateTime endDate) {
int startWeekNumber = 0;
int endWeekNumber = 0;
int numberOfWeeksInRange = 0;
if (startDate.Year == endDate.Year) {
startWeekNumber = 0;
endWeekNumber = 0;
startWeekNumber = cal.GetWeekOfYear(startDate,
weekRule,
dayofWeek);
endWeekNumber = cal.GetWeekOfYear(endDate,
weekRule,
dayofWeek);
numberOfWeeksInRange = endWeekNumber - startWeekNumber;
}
else { // calculate per year, inclusive
for (int year = startDate.Year; year <= endDate.Year; year++) {
startWeekNumber = 0;
endWeekNumber = 0;
if (year == startDate.Year) { // start date through the end of the year
startWeekNumber = cal.GetWeekOfYear(startDate, weekRule, dayofWeek);
endWeekNumber = cal.GetWeekOfYear((new DateTime(year + 1, 1, 1).AddDays(-1)),
weekRule, dayofWeek);
}
else if (year == endDate.Year) { // start of the given year through the end date
startWeekNumber = cal.GetWeekOfYear((new DateTime(year, 1, 1)),
weekRule, dayofWeek);
endWeekNumber = cal.GetWeekOfYear(endDate,
weekRule, dayofWeek);
}
else { // calculate the total number of weeks in this year
startWeekNumber = cal.GetWeekOfYear(new DateTime(year, 1, 1),
weekRule, dayofWeek);
endWeekNumber = cal.GetWeekOfYear((new DateTime(year + 1, 1, 1).AddDays(-1)),
weekRule, dayofWeek;
}
numberOfWeeksInRange += endWeekNumber - startWeekNumber;
}
}
return numberOfWeeksInRange;
}
答案 3 :(得分:1)
(dtTo - dtFrom).TotalDays / 7
将给出周数
答案 4 :(得分:1)
public static int NumberOfWeeks(DateTime dateFrom, DateTime dateTo)
{
TimeSpan Span = dateTo.Subtract(dateFrom);
if (Span.Days <= 7)
{
if (dateFrom.DayOfWeek > dateTo.DayOfWeek)
{
return 2;
}
return 1;
}
int Days = Span.Days - 7 + (int)dateFrom.DayOfWeek;
int WeekCount = 1;
int DayCount = 0;
for (WeekCount = 1; DayCount < Days; WeekCount++)
{
DayCount += 7;
}
return WeekCount;
}
答案 5 :(得分:0)
您可以尝试以下方式:
var d1 = new DateTime(2011, 01, 05);
var d2 = new DateTime(2010, 01, 05);
Console.WriteLine((d1 - d2).Days / 7);
您可能需要根据您的具体要求向上或向下舍入结果,但这应该可以解决问题。
答案 6 :(得分:0)
如果你尝试将divise转换为整数,它将无效。你必须加倍。
DateTime startDateTime = new DateTime(2010, 8, 1);
DateTime endDateTime = new DateTime(2010, 8, 28);
double weeks = (endDateTime - startDateTime).TotalDays / 7;