C# C中两个日期之间的周差#

C# C中两个日期之间的周差#,c#,datetime,date-difference,C#,Datetime,Date Difference,我试图在C#中创建一个函数,返回两个日期之间的周差。其目标是在以下方面提供相同的结果: select datediff(ww,'2018-04-13','2018-04-16') as diff 在上面的例子中,这些日期之间只有3天,但它们在不同的星期,因此结果应该是1 我尝试使用.TotalDays,但它不能正常工作。我还尝试了.GetWeekOfYear,但当日期的年份不同时,它将无法正确返回。在StackOverflow和其他论坛上,我似乎有很多问题,但到目前为止,没有一个与我的情况相符

我试图在C#中创建一个函数,返回两个日期之间的周差。其目标是在以下方面提供相同的结果:

select datediff(ww,'2018-04-13','2018-04-16') as diff
在上面的例子中,这些日期之间只有3天,但它们在不同的星期,因此结果应该是1

我尝试使用
.TotalDays
,但它不能正常工作。我还尝试了
.GetWeekOfYear
,但当日期的年份不同时,它将无法正确返回。在StackOverflow和其他论坛上,我似乎有很多问题,但到目前为止,没有一个与我的情况相符。这是我正在尝试实现的功能:

public static int GetWeekDiff(DateTime dtStart, DateTime dtEnd) {
    // Doesn't work
    var val = ((dtEnd - dtStart).TotalDays / 7);
    val = Math.Ceiling(val);
    return Convert.ToInt32(val);

    // Doesn't work well between years
    DateTimeFormatInfo dinfo = DateTimeFormatInfo.CurrentInfo;
    var x = dinfo.Calendar.GetWeekOfYear(dtStart, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);
    var y = dinfo.Calendar.GetWeekOfYear(dtEnd, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);

    return y - x;

}
在函数的第一部分中,我尝试了中描述的内容。它不起作用

你能帮我吗? 提前谢谢。

也许会有帮助

    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);
    }
public static int GetIso8601WeekOfYear(日期时间)
{
//严重作弊。如果是星期一、星期二或星期三,那么
//无论星期四、星期五或星期六是什么样的星期,
//我们总是能做到这些
DayOfWeek day=CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(时间);

如果(day>=DayOfWeek.Monday&&day看看这是否有效。可能还有更多的用例没有涵盖,解决方案取决于您如何定义周边界(根据上面的评论,这假设为周日-周一)

//输出:
//2017年12月28日至2018年1月10日之间的周数:2
//2018年4月13日至2018年4月16日之间的周数:1
//2018年4月21日至2018年4月22日之间的周数:0
//2018年4月22日至2018年4月23日之间的周数:1
void Main()
{
var datePairs=新列表();
datePairs.Add(新的KeyValuePair(新的DateTime(2017,12,28),新的DateTime(2018,1,10));
添加(新的KeyValuePair(新的DateTime(2018,4,13)、新的DateTime(2018,4,16));
添加(新的KeyValuePair(新的DateTime(2018,4,21),新的DateTime(2018,4,22));
添加(新的KeyValuePair(新的DateTime(2018,4,22),新的DateTime(2018,4,23));
foreach(日期对中的var-datePair)
{
var string1=datePair.Key.ToShortDateString();
var string2=datePair.Value.ToShortDateString();
Console.WriteLine($“在{string1}和{string2}之间的周:{GetWeekDiff(datePair.Key,datePair.Value)}”);
}
}
公共静态int GetWeekDiff(DateTime dtStart,DateTime dtEnd)
{
var totalDays=(dtEnd-dtStart).totalDays;
风险值周=(整数)总天数/7;
var HasRequires=totalDays%7>0;
如果(剩余)
{
如果(!(dtStart.DayOfWeek.Equals(DayOfWeek.Saturday)和&dtEnd.DayOfWeek.Equals(DayOfWeek.Sunday)))
{
周++;
}
}
返回周;
}

首先计算两个日期之间的天数。将天数除以7得到完整的周数

现在,通过计算天数模数7得到剩余天数来计算是否还有额外的一周。如果第一个日期加上剩余天数落在不同的一周,则在计数上再加一周

void Main()
{

    var first = new DateTime(2018, 04, 13);
    var second = new DateTime(2018, 04, 16);

    Console.WriteLine(weekDiff(first, second));
}

public int weekDiff(DateTime d1, DateTime d2, DayOfWeek startOfWeek = DayOfWeek.Monday)
{
    var diff = d2.Subtract(d1);

    var weeks = (int)diff.Days / 7;

    // need to check if there's an extra week to count
    var remainingDays = diff.Days % 7;
    var cal = CultureInfo.InvariantCulture.Calendar;
    var d1WeekNo = cal.GetWeekOfYear(d1, CalendarWeekRule.FirstFullWeek, startOfWeek);
    var d1PlusRemainingWeekNo = cal.GetWeekOfYear(d1.AddDays(remainingDays), CalendarWeekRule.FirstFullWeek, startOfWeek);

    if (d1WeekNo != d1PlusRemainingWeekNo)
        weeks++;

    return weeks;
}

目前无法发表评论,并且已经在这篇文章中使用了一个标志,我认为这是类似的内容。下面是我发现的另一篇文章,它似乎与您尝试创建的解决方案一致:


首先,将日期设置为当前一周的星期一。然后将所有整周(
/7
天计算为int)。虽然很简单,但它可以跨周和跨年工作。

这是我解决类似问题的实现,我还没有完全测试过,但它似乎可以工作

        var dt1 = DateTime.Today.AddDays(-30);
        var dt2 = DateTime.Today;

        var noOfDays =(int) (dt2 - dt1).TotalDays;
        int reminder;
        var weeks = Math.DivRem(noOfDays, 7, out reminder);
        weeks = reminder > 0 ? weeks + 1 : weeks;

它返回1周,间隔6天或更少,这正是我所需要的。

问题是什么,只要检查年份,如果它们不相同,将一年中的所有周相加,并将其添加到不同的可能重复的@Leustherin部分重叠,但这里OP希望返回1周,如果是周日到周一(间隔1天)0个星期,如果是在同一周的星期六到星期日。你可以计算一个星期的开始日期,然后得到总天数,除以7,然后循环。你需要确定你认为一周的开始,如果第二个日期在第一个之前,你想要返回什么。你能提供更多的T吗?est案例和预期结果?不会在同一周内处理两个不同的日期,这两个日期应返回0。@DanWilson感谢您的回答!我尝试了它,做了一些测试,到目前为止它似乎工作正常。@DanWilson仍然无法正确处理2018年4月13日至2018年4月14日之间同一周的日期:1
对不起,我失败了:(您的解决方案也有效。我之所以使用它,是因为您允许设置本周的开始时间。
static void Main(string[] args)
{
    DateTime date1 = new DateTime(2018, 04, 18);
    DateTime date2 = new DateTime(2018, 04, 19);


    System.Console.WriteLine((GetDiff(new DateTime(2018, 04, 18), new DateTime(2018, 04, 18)))); // 0
    System.Console.WriteLine((GetDiff(new DateTime(2018, 04, 22), new DateTime(2018, 04, 23)))); // 1
    System.Console.WriteLine((GetDiff(new DateTime(2018, 04, 16), new DateTime(2018, 04, 22)))); // 0
    System.Console.WriteLine((GetDiff(new DateTime(2018, 04, 18), new DateTime(2018, 05, 03)))); // 2
}

private static int GetDiff(DateTime date1, DateTime date2)
{
    date1 = SetDayToMonday(date1);
    date2 = SetDayToMonday(date2);

    return (int)((date2 - date1).TotalDays / 7);
}

private static DateTime SetDayToMonday(DateTime date)
{ 
    var weekDay = date.DayOfWeek;
    if (weekDay == DayOfWeek.Sunday)
        return date.AddDays(-6);
    else
        return date.AddDays(-((int)weekDay-1));
}
        var dt1 = DateTime.Today.AddDays(-30);
        var dt2 = DateTime.Today;

        var noOfDays =(int) (dt2 - dt1).TotalDays;
        int reminder;
        var weeks = Math.DivRem(noOfDays, 7, out reminder);
        weeks = reminder > 0 ? weeks + 1 : weeks;