2009-11-03 22 views
56

Me preguntaba si ustedes saben cómo obtener la fecha de lunes de la semana de corrientes en función de la fecha de hoy?¿Obtener la fecha del primer lunes de la semana?

es decir 2009-11-03 2009-11-02 entraban y consigue vuelto hacia atrás

/M

+1

Eche un vistazo a esta pregunta: http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week –

Respuesta

125

Esto es lo que yo uso (probablemente no internacionalizado):

DateTime input = //... 
int delta = DayOfWeek.Monday - input.DayOfWeek; 
DateTime monday = input.AddDays(delta); 
+1

Sí, de hecho: No internacionalizado El lunes no siempre es el primer día de la semana. –

+15

Puede obtener el primer día de la semana usando: CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek –

+10

En realidad, el primer día de la semana según la cultura no tiene ningún interés en este caso; el OP quiere el lunes de la semana, no el primer día de la semana. –

6

Algo como esto funcionaría

DateTime dt = DateTime.Now; 
while(dt.DayOfWeek != DayOfWeek.Monday) dt = dt.AddDays(-1); 

Estoy seguro de que hay una manera más agradable aunque :)

0

Prueba esto:

public DateTime FirstDayOfWeek(DateTime date) 
{ 
    var candidateDate=date; 
    while(candidateDate.DayOfWeek!=DayOfWeek.Monday) { 
     candidateDate=candidateDate.AddDays(-1); 
    } 
    return candidateDate; 
} 

EDITAR esté completo: sobrecarga para la fecha de hoy:

public DateTime FirstDayOfCurrentWeek() 
{ 
    return FirstDayOfWeek(DateTime.Today); 
} 
+0

¿Por qué bucle?, Hay formas de hacerlo sin un bucle. Consulte las respuestas a continuación. –

53

La respuesta Pondium puede buscar hacia adelante en algún caso. Si desea que sólo Búsqueda atrás, creo que debería ser:

DateTime input = //... 
int delta = DayOfWeek.Monday - input.DayOfWeek; 
if(delta > 0) 
    delta -= 7; 
DateTime monday = input.AddDays(delta); 
+3

Esta debería ser la respuesta correcta ya que maneja los domingos, es decir, FirstDayOfWeek es el lunes, así que si el domingo es la fecha de entrada debería devolver el lunes anterior. La respuesta aceptada no. –

+1

+1 Si la 'entrada' es 1/1/2017 (un domingo) ¡este código da 26/12/2016 como el primer día de la semana! No 2/1/2017 (¡que la respuesta aceptada da!) –

+0

¡También funciona para 01/01/2019 = 31/12/2018! –

1
var now = System.DateTime.Now; 

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date; 

Probablemente volverá con el lunes. A menos que use una cultura en la que el lunes no sea el primer día de la semana.

3

¿Qué hay de:

CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 

¿Por qué no utilizar la solución nativa?

+2

La pregunta es para obtener la fecha específica (es decir, 2015-11-20) no qué día se define como el primer día. –

4
public static class DateTimeExtension 
{ 
    public static DateTime GetFirstDayOfWeek(this DateTime date) 
    { 
     var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; 

     while (date.DayOfWeek != firstDayOfWeek) 
     { 
      date = date.AddDays(-1); 
     } 

     return date; 
    } 
} 

Internacional aquí. Creo que como extensión puede ser más útil.

Cuestiones relacionadas