Für die Zwecke dieser Frage, nehmen wir an, der Benutzer wird aus den USA und wird den Gregorianischen Standardkalender verwenden. Eine Kalenderwoche beginnt also am Sonntag und endet am Samstag.Erhalten Sie die Anzahl der Kalenderwochen zwischen 2 Daten in C#
Was ich versuche, ist die Anzahl der Kalenderwochen zwischen zwei Daten zu bestimmen. Ein perfektes Beispiel für mein Problem gibt es im Oktober 2010. Zwischen dem 16.10. Und dem 31.10. Gibt es 4 Kalenderwochen.
- October 10-16 Oktober
- October 17-23 Oktober
- October 24-30 Oktober
- 31 Oktober-November 6
Ich würde es vorziehen, von jeder Logik fest codierten wie zu bleiben weg:
if (Day == DayOfWeek.Saturday && LastDayOfMonth == 31) { ... }
jemand eine logische Art und Weise denken, dies zu tun?
UPDATE:
Danke für all die großen Antworten, nach einiger Überlegung hier ist die Lösung, die ich verwendet:
//get the start and end dates of the current pay period
DateTime currentPeriodStart = SelectedPeriod.Model.PeriodStart;
DateTime currentPeriodEnd = SelectedPeriod.Model.PeriodEnd;
//get the first sunday & last saturday span that encapsulates the current pay period
DateTime firstSunday = DayExtensions.SundayBeforePeriodStart(currentPeriodStart);
DateTime lastSaturday = DayExtensions.SaturdayAfterPeriodEnd(currentPeriodEnd);
//get the number of calendar weeks in the span
int numberOfCalendarWeeks = DayExtensions.CalendarWeeks(firstSunday, lastSaturday);
Und hier sind die Methoden aus der Helferklasse:
/// <summary>
/// Get the first Sunday before the pay period start date
/// </summary>
/// <param name="periodStartDate">Date of the pay period start date</param>
/// <returns></returns>
public static DateTime SundayBeforePeriodStart(DateTime periodStartDate)
{
DateTime firstDayOfWeekBeforeStartDate;
int daysBetweenStartDateAndPreviousFirstDayOfWeek = (int)periodStartDate.DayOfWeek - (int)DayOfWeek.Sunday;
if (daysBetweenStartDateAndPreviousFirstDayOfWeek >= 0)
{
firstDayOfWeekBeforeStartDate = periodStartDate.AddDays(-daysBetweenStartDateAndPreviousFirstDayOfWeek);
}
else
{
firstDayOfWeekBeforeStartDate = periodStartDate.AddDays(-(daysBetweenStartDateAndPreviousFirstDayOfWeek + 7));
}
return firstDayOfWeekBeforeStartDate;
}
/// <summary>
/// Get the first Saturday after the period end date
/// </summary>
/// <param name="periodEndDate">Date of the pay period end date</param>
/// <returns></returns>
public static DateTime SaturdayAfterPeriodEnd(DateTime periodEndDate)
{
DateTime lastDayOfWeekAfterEndDate;
int daysBetweenEndDateAndFollowingLastDayOfWeek = (int)DayOfWeek.Saturday - (int)periodEndDate.DayOfWeek;
if (daysBetweenEndDateAndFollowingLastDayOfWeek >= 0)
{
lastDayOfWeekAfterEndDate = periodEndDate.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek);
}
else
{
lastDayOfWeekAfterEndDate = periodEndDate.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek + 7);
}
return lastDayOfWeekAfterEndDate;
}
/// <summary>
/// Get the calendar weeks between 2 dates
/// </summary>
/// <param name="d1">First day of date span</param>
/// <param name="d2">Last day of date span</param>
/// <returns></returns>
public static int CalendarWeeks(DateTime d1, DateTime d2)
{
return 1 + (int)((d2 - d1).TotalDays/7);
}
Und wenn Sie neugierig sind, ist das, was ich am Ende mit den Daten tun:
//create an array of all the sundays in this span
DateTime[] _sundays = new DateTime[numberOfCalendarWeeks];
//put the first sunday in the period
_sundays[0] = firstSunday;
//step through each week and get each sunday until you reach the last saturday
for (int i = 1; i <= numberOfCalendarWeeks - 1; i++)
{
DateTime d = new DateTime();
d = firstSunday.AddDays(i * 7);
_sundays[i] = d;
}
for (int i = 0; i <= _sundays.Length-1; i++)
{
//bind my view model with each sunday.
}
Wenn ich Sie richtig verstehe, wollen Sie die Anzahl der vollen Wochen (was meiner Meinung nach sollte von * Montag * bis Sonntag) zwischen zwei angegebenen Daten, so von Donnerstag, 18. Juni, bis Mittwoch, 24. Juni Sie hätte nicht eine Woche (wie in 7 Tagen), aber keine, da du nur einmal am Montag vorbeikommst und den Sonntag danach nicht erreichst, stimmt das? – Treb
Diese spezielle Anwendung fordert Sun-Sat. Denken Sie an 2 Zahlungsperioden in einem Monat (10/1 Periode und die 10/16 Periode). Eine Arbeitswoche in diesem Szenario ist Sun-Sa. Also, die 10/16 Pay-Periode läuft durch 4 Kalenderwochen. Sinn ergeben? –
Suchen Sie nach einem einfachen formelhaften Ansatz oder sind Sie mit einem algorithmischen Ansatz einverstanden? Wie wichtig wäre es auch, dass die Formel/der Algorithmus Schaltjahre/-tage usw. berücksichtigt? – jrista