Ich versuche, eine Funktion in C # zu erstellen, die die Wochendifferenz zwischen zwei Daten zurückgibt. Ihr Ziel ist es, das gleiche Ergebnis zu erzielen:

select datediff(ww,'2018-04-13','2018-04-16') as diff

Im obigen Beispiel liegen zwischen diesen Daten nur 3 Tage, sie liegen jedoch in unterschiedlichen Wochen, sodass das Ergebnis 1 sein sollte.

Ich habe versucht, .TotalDays zu verwenden, aber es funktioniert nicht richtig. Ich habe auch .GetWeekOfYear ausprobiert, aber es wird nicht korrekt zurückgegeben, wenn das Jahr der Daten unterschiedlich ist. Ich habe hier in StackOverflow und in anderen Foren viele Fragen, und bisher passt keine zu meinem Fall. Dies ist die Funktion, die ich zu weit versuche:

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;

}

Im ersten Teil meiner Funktion habe ich versucht, was in dieser Beitrag. Es hat nicht funktioniert

Kannst du mir helfen? Danke im Voraus.

2
André Luiz 19 Apr. 2018 im 17:52

6 Antworten

Beste Antwort

Stellen Sie zunächst fest, wie viele Tage zwischen den beiden Daten liegen. Teilen Sie die Anzahl der Tage durch 7, um volle Wochen zu erhalten.

Stellen Sie nun fest, ob eine zusätzliche Woche zu zählen ist, indem Sie die Anzahl der Tage Modul 7 ermitteln, um die verbleibenden Tage zu erhalten. Wenn das erste Datum plus die verbleibenden Tage in eine andere Woche fallen, fügen Sie der Zählung eine zusätzliche Woche hinzu.

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;
}
3
phuzi 19 Apr. 2018 im 15:24

Überprüfen Sie, ob dies funktioniert. Es könnte weitere Anwendungsfälle geben, die hier nicht behandelt werden, und die Lösung hängt davon ab, wie Sie eine Wochengrenze definieren (dies setzt Sonntag-Montag voraus, basierend auf einem Kommentar oben).

// Output:
// Weeks between 12/28/2017 and 1/10/2018: 2
// Weeks between 4/13/2018 and 4/16/2018: 1
// Weeks between 4/21/2018 and 4/22/2018: 0
// Weeks between 4/22/2018 and 4/23/2018: 1

void Main()
{
    var datePairs = new List<KeyValuePair<DateTime, DateTime>>();
    datePairs.Add(new KeyValuePair<DateTime, DateTime>(new DateTime(2017, 12, 28), new DateTime(2018, 1, 10)));
    datePairs.Add(new KeyValuePair<DateTime, DateTime>(new DateTime(2018, 4, 13), new DateTime(2018, 4, 16)));
    datePairs.Add(new KeyValuePair<DateTime, DateTime>(new DateTime(2018, 4, 21), new DateTime(2018, 4, 22)));
    datePairs.Add(new KeyValuePair<DateTime, DateTime>(new DateTime(2018, 4, 22), new DateTime(2018, 4, 23)));

    foreach (var datePair in datePairs)
    {
        var string1 = datePair.Key.ToShortDateString();
        var string2 = datePair.Value.ToShortDateString();
        Console.WriteLine($"Weeks between {string1} and {string2}: {GetWeekDiff(datePair.Key, datePair.Value)}");
    }
}

public static int GetWeekDiff(DateTime dtStart, DateTime dtEnd)
{
    var totalDays = (dtEnd - dtStart).TotalDays;
    var weeks = (int)totalDays / 7;
    var hasRemainder = totalDays % 7 > 0;
    if (hasRemainder)
    {
        if (!(dtStart.DayOfWeek.Equals(DayOfWeek.Saturday) && dtEnd.DayOfWeek.Equals(DayOfWeek.Sunday)))
        {
            weeks++;
        }
    }
    return weeks;
}
1
Dan Wilson 19 Apr. 2018 im 15:18
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));
}

Stellen Sie zuerst den Tag auf den Montag der aktuellen Woche ein. Zählen Sie dann alle vollen Wochen (= /7 Tage als int). So einfach es ist, es funktioniert wahrscheinlich über Wochen und Jahre.

1
Chrᴉz says reinstate Monica 19 Apr. 2018 im 15:32

Vielleicht kann es helfen

    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);
    }

Holen Sie sich die richtige Wochennummer eines bestimmten Datums

0
Artyom Shmarlovsky 19 Apr. 2018 im 15:02

Ich kann noch keinen Kommentar abgeben und habe bereits eine Flagge in diesem Beitrag für etwas verwendet, von dem ich glaubte, dass es ähnlich ist. Hier ist ein weiterer Beitrag, den ich gefunden habe und der anscheinend mit der Lösung übereinstimmt, die Sie erstellen möchten:

Ermitteln Sie die Anzahl der Kalenderwochen zwischen zwei Daten in C #

0
Leustherin 19 Apr. 2018 im 15:26

Dies ist meine Implementierung, um ein ähnliches Problem zu lösen. Ich habe es nicht gründlich getestet, aber es scheint zu funktionieren.

        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;

Es gibt 1 Woche für 6 Tage oder weniger Lücke zurück, genau das, was ich brauchte.

0
SANM2009 17 Dez. 2018 im 23:32