Para los fines de esta pregunta, supongamos que el usuario será de EE. UU. Y utilizará el calendario gregoriano estándar. Entonces, una semana calendario comienza el domingo y termina el sábado.Obtenga el número de semanas calendario entre 2 fechas en C#
Lo que estoy tratando de hacer es determinar el número de semanas calendario que existen entre dos fechas. Un ejemplo perfecto de mi problema existe en octubre de 2010. Entre el 10/16 y el 10/31 hay 4 semanas calendario.
- 10 10 hasta 10 16
- 10 17 hasta 10 23
- 10 24 hasta 10 30
- octubre 31 a noviembre 6
preferiría permanecer lejos de cualquier lógica codificada como:
if (Day == DayOfWeek.Saturday && LastDayOfMonth == 31) { ... }
¿Puede alguien pensar en una forma lógica de hacer esto?
ACTUALIZACIÓN:
Gracias por todas las grandes respuestas, después de cierta consideración aquí es la solución utilicé:
//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);
Y aquí están los métodos de la clase de ayuda:
/// <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);
}
Y si tienes curiosidad, esto es lo que termino haciendo con las fechas:
//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.
}
Si he entendido bien, desea que el número de semanas completas (que creo que debería ser de * Lunes * a domingo) entre dos fechas dadas, por lo que a partir del jueves, 18 de junio al Miércoles, 24 de junio de usted no tendría una semana (como en 7 días), pero ninguna, ya que solo pasas el lunes una vez, y no alcanzas el domingo después, ¿es correcto? – Treb
Esta aplicación en particular requiere Sun-Sat. Piense en 2 períodos de pago en un mes (período de 10/1 y el período de 10/16). Una semana de trabajo en este escenario es Sun-Sat. Por lo tanto, el período de pago 10/16 se ejecuta a través de 4 semanas calendario. ¿Tener sentido? –
¿Está buscando un enfoque de fórmula simple, o está bien con un enfoque algorítmico? Además, ¿qué tan importante sería que la fórmula/algoritmo tenga en cuenta los años/días bisiestos, etc.? – jrista