2009-03-18 8 views
33

¿Cuál es la mejor manera de calcular la fecha de inicio y finalización de la semana anterior en C#? Es decir. hoy 18 de marzo daría lugar al 9 de marzo (lunes de la semana pasada) y al 15 de marzo (domingo de la semana pasada).Calcular la fecha de inicio y finalización de la semana anterior

He visto esto hecho con DayOfWeek y una declaración de cambio para calcular una compensación pero me preguntaba si hay una manera más elegante.

+0

¿Qué pasa con la complicación de cálculo de la semana de trabajo anterior al cierre de la empresa el viernes, que luego debe volver la semana en curso que el viernes estaba en? –

Respuesta

55

puede omitir el bucle while y utilizar

DateTime mondayOfLastWeek = date.AddDays(-(int)date.DayOfWeek - 6); 

Esto asume que está utilizando el lunes como el primer día de la semana .

+2

Para responder a la pregunta, startOfWeek debería llamarse sundayOfLastWeek. "DateTime mondayOfLastWeek = date.AddDays (- (int) date.DayOfWeek - 6);" –

+0

Gracias por la corrección Austin Salonen – bstoney

+4

Niza un enfoque de revestimiento. Creo que lo siguiente funcionaría independientemente del día en que se ejecute: mondayOfLastWeek = DateTime.Now.AddDays (- (int) DateTime.Now.DayOfWeek - 6); sundayOfLastWeek = DateTime.Now.AddDays (- (int) DateTime.Now.DayOfWeek); – Henryk

22
DayOfWeek weekStart = DayOfWeek.Monday; // or Sunday, or whenever 
DateTime startingDate = DateTime.Today; 

while(startingDate.DayOfWeek != weekStart) 
    startingDate = startingDate.AddDays(-1); 

DateTime previousWeekStart = startingDate.AddDays(-7); 
DateTime previousWeekEnd = startingDate.AddDays(-1); 

Leer: Atrás un día a la vez hasta que estemos en el inicio de esta semana, y luego restar siete para llegar al inicio de la semana pasada.

+0

inteligente !!! Una manera muy simple y fácil – redDragonzz

3

Usando DayOfWeek sería una manera de lograr esto:

DateTime date = DateTime.Now.AddDays(-7); 
    while (date.DayOfWeek != DayOfWeek.Monday) 
    { 
     date = date.AddDays(-1); 
    } 

    DateTime startDate = date; 
    DateTime endDate = date.AddDays(7); 
0

Se puede crear un método DateTime de extensión, que se puede utilizar con un parámetro DayOfWeek:

public static class DateTimeExtension 
{ 
    public static DateTime GetPreviousWeekDay(this DateTime currentDate, DayOfWeek dow) 
    { 
     int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow; 
     return currentDate.AddDays(-7).AddDays(gotoDay-currentDay); 
    }   
} 

luego usarlo como sigue:

DateTime testDate = new DateTime(2017, 01, 21); 

Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Sunday)); 
Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Saturday)); 
0

La solución aceptada no es correcta en realidad.

Debe cambiar cuando la semana "se rompe", es decir, cuando considera que la semana termina o comienza, y la fórmula en la solución aceptada no.

Esto no es tan visible los lunes como el inicio de la semana, pero más si se considera el jueves al final de la semana.

fórmula correcta es (para un jueves como del final del día):

DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1); 

Para el lunes, el -5 sería cambiar a -2.

Ejemplo de código para imprimir

 String s = ""; 
     DateTime date = new DateTime(2017, 1, 1); 
     for (int i = 0; i < 14; i++) 
     { 
      date = date.AddDays(1); 
      DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1); 
      DateTime mon = date.AddDays(-(int)(date.AddDays(-2).DayOfWeek) -1); 
      s += date.ToString() + " - Thu: " + thu.ToString() + " - Mon: " + mon.ToString() + "\r\n"; 
     } 
     Console.WriteLine(s); 
Cuestiones relacionadas