spanish semanas semana obtener numero mes español dias dela año actual c# datetime

c# - semanas - ¿Cómo puedo obtener el DateTime para el inicio de la semana?



obtener dias dela semana c# (27)

¿Cómo encuentro el comienzo de la semana (tanto el domingo como el lunes) sabiendo la hora actual en C #?

Algo como:

DateTime.Now.StartWeek(Monday);


Aquí hay una combinación de algunas de las respuestas. Utiliza un método de extensión que permite que la cultura se transmita, si no se pasa una, se utiliza la cultura actual. Esto le dará la máxima flexibilidad y reutilización.

/// <summary> /// Gets the date of the first day of the week for the date. /// </summary> /// <param name="date">The date to be used</param> /// <param name="cultureInfo">If none is provided, the current culture is used</param> /// <returns>The date of the beggining of the week based on the culture specifed</returns> public static DateTime StartOfWeek(this DateTime date, CultureInfo cultureInfo=null) => date.AddDays(-1 * (7 + (date.DayOfWeek - (cultureInfo??CultureInfo.CurrentCulture).DateTimeFormat.FirstDayOfWeek)) % 7).Date;

Ejemplo de uso:

public static void TestFirstDayOfWeekExtension() { DateTime date = DateTime.Now; foreach(System.Globalization.CultureInfo culture in CultureInfo.GetCultures(CultureTypes.UserCustomCulture | CultureTypes.SpecificCultures)) { Console.WriteLine($"{culture.EnglishName}: {date.ToShortDateString()} First Day of week: {date.StartOfWeek(culture).ToShortDateString()}"); } }


Combinemos la respuesta de cultura segura y la respuesta del método de extensión:

public static class DateTimeExtensions { public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) { System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture; DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek; return DateTime.Today.AddDays(-(DateTime.Today.DayOfWeek- fdow)); } }


El módulo en C # funciona mal para -1mod7 (debería ser 6, c # devuelve -1) así que ... la solución "oneliner" para esto se verá así :)

private static DateTime GetFirstDayOfWeek(DateTime date) { return date.AddDays(-(((int)date.DayOfWeek - 1) - (int)Math.Floor((double)((int)date.DayOfWeek - 1) / 7) * 7)); }


El siguiente método debe devolver el DateTime que desee. Pase en true para que el domingo sea el primer día de la semana, falso para el lunes:

private DateTime getStartOfWeek(bool useSunday) { DateTime now = DateTime.Now; int dayOfWeek = (int)now.DayOfWeek; if(!useSunday) dayOfWeek--; if(dayOfWeek < 0) {// day of week is Sunday and we want to use Monday as the start of the week // Sunday is now the seventh day of the week dayOfWeek = 6; } return now.AddDays(-1 * (double)dayOfWeek); }


Esto devolverá tanto el comienzo de la semana como el final de las fechas de la semana:

private string[] GetWeekRange(DateTime dateToCheck) { string[] result = new string[2]; TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day DateTime dateRangeBegin = dateToCheck; DateTime dateRangeEnd = DateTime.Today.Add(duration); dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek); dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek); result[0] = dateRangeBegin.Date.ToString(); result[1] = dateRangeEnd.Date.ToString(); return result; }

He publicado el código completo para calcular el inicio / fin de semana, mes, trimestre y año en mi blog ZamirsBlog


Esto puede ser un poco de pirateo, pero puede convertir la propiedad .DayOfWeek a un int (es una enumeración y dado que no se cambió su tipo de datos subyacente, el valor predeterminado es int) y usarlo para determinar el inicio de la semana anterior .

Aparece la semana especificada en la enumeración de DayOfWeek que comienza el domingo, por lo que si restamos 1 de este valor, será igual a cuántos días es el lunes anterior a la fecha actual. También necesitamos mapear el domingo (0) para que sea igual a 7, por lo que, dado que 1 - 7 = -6, el domingo se asignará al lunes anterior:

DateTime now = DateTime.Now; int dayOfWeek = (int)now.DayOfWeek; dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek; DateTime startOfWeek = now.AddDays(1 - (int)now.DayOfWeek);

El código del domingo anterior es más sencillo ya que no tenemos que hacer este ajuste:

DateTime now = DateTime.Now; int dayOfWeek = (int)now.DayOfWeek; DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);


Esto te daría el domingo anterior (creo):

DateTime t = DateTime.Now; t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);


Esto te daría la medianoche del primer domingo de la semana:

DateTime t = DateTime.Now; t -= new TimeSpan ((int) t.DayOfWeek, t.Hour, t.Minute, t.Second);

Esto te da el primer lunes a la medianoche:

DateTime t = DateTime.Now; t -= new TimeSpan ((int) t.DayOfWeek - 1, t.Hour, t.Minute, t.Second);


Feo pero al menos devuelve las fechas correctas

Con inicio de semana establecido por sistema:

public static DateTime FirstDateInWeek(this DateTime dt) { while (dt.DayOfWeek != System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek) dt = dt.AddDays(-1); return dt; }

Sin:

public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay) { while (dt.DayOfWeek != weekStartDay) dt = dt.AddDays(-1); return dt; }


Gracias por los ejemplos. Necesitaba usar siempre el primer día de la semana de "CurrentCulture" y para una matriz necesitaba saber el Número de Día exacto ... así que aquí están mis primeras extensiones:

public static class DateTimeExtensions { //http://.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week //http://.com/questions/1788508/calculate-date-with-monday-as-dayofweek1 public static DateTime StartOfWeek(this DateTime dt) { //difference in days int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc. //As a result we need to have day 0,1,2,3,4,5,6 if (diff < 0) { diff += 7; } return dt.AddDays(-1 * diff).Date; } public static int DayNoOfWeek(this DateTime dt) { //difference in days int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc. //As a result we need to have day 0,1,2,3,4,5,6 if (diff < 0) { diff += 7; } return diff + 1; //Make it 1..7 } }


Juntándolo todo, con la globalización y permitiendo especificar el primer día de la semana como parte de la llamada que tenemos

public static DateTime StartOfWeek ( this DateTime dt, DayOfWeek? firstDayOfWeek ) { DayOfWeek fdow; if ( firstDayOfWeek.HasValue ) { fdow = firstDayOfWeek.Value; } else { System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture; fdow = ci.DateTimeFormat.FirstDayOfWeek; } int diff = dt.DayOfWeek - fdow; if ( diff < 0 ) { diff += 7; } return dt.AddDays( -1 * diff ).Date; }


La forma más rápida que se me ocurre es:

var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);

Si desea que cualquier otro día de la semana sea su fecha de inicio, todo lo que debe hacer es agregar el valor de DayOfWeek al final

var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday); var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday);


Lo mismo para el fin de semana (en el estilo de @Compile esta respuesta):

public static DateTime EndOfWeek(this DateTime dt) { int diff = 7 - (int)dt.DayOfWeek; diff = diff == 7 ? 0 : diff; DateTime eow = dt.AddDays(diff).Date; return new DateTime(eow.Year, eow.Month, eow.Day, 23, 59, 59, 999) { }; }


Nadie parece haber respondido correctamente todavía. Pegaré mi solución aquí por si alguien la necesita. El siguiente código funciona independientemente de si el primer día de la semana es un lunes o un domingo o algo más.

public static class DateTimeExtension { public static DateTime GetFirstDayOfThisWeek(this DateTime d) { CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture; var first = (int)ci.DateTimeFormat.FirstDayOfWeek; var current = (int)d.DayOfWeek; var result = first <= current ? d.AddDays(-1 * (current - first)) : d.AddDays(first - current - 7); return result; } } class Program { static void Main() { System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); Console.WriteLine("Current culture set to en-US"); RunTests(); Console.WriteLine(); System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK"); Console.WriteLine("Current culture set to da-DK"); RunTests(); Console.ReadLine(); } static void RunTests() { Console.WriteLine("Today {1}: {0}", DateTime.Today.Date.GetFirstDayOfThisWeek(), DateTime.Today.Date.ToString("yyyy-MM-dd")); Console.WriteLine("Saturday 2013-03-02: {0}", new DateTime(2013, 3, 2).GetFirstDayOfThisWeek()); Console.WriteLine("Sunday 2013-03-03: {0}", new DateTime(2013, 3, 3).GetFirstDayOfThisWeek()); Console.WriteLine("Monday 2013-03-04: {0}", new DateTime(2013, 3, 4).GetFirstDayOfThisWeek()); } }


Podrías usar la excelente biblioteca de Umbrella :

using nVentive.Umbrella.Extensions.Calendar; DateTime beginning = DateTime.Now.BeginningOfWeek();

Sin embargo, parece que se almacenaron los lunes como el primer día de la semana (consulte la propiedad nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn ), por lo que la solución localizada anterior es un poco mejor. Desgraciado.

Edición : mirando más de cerca la pregunta, parece que Umbrella podría funcionar para eso también:

// Or DateTime.Now.PreviousDay(DayOfWeek.Monday) DateTime monday = DateTime.Now.PreviousMonday(); DateTime sunday = DateTime.Now.PreviousSunday();

Aunque vale la pena señalar que si solicita el lunes anterior un lunes, le devolveremos siete días. Pero esto también es cierto si usa BeginningOfWeek , que parece un error :(.


Probé varios, pero no resolví el problema con una semana a partir de un lunes, lo que me dio el lunes siguiente el domingo. Así que lo modifiqué un poco y lo puse a trabajar con este código:

int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek; DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta); return monday;


Si desea sábados o domingos o cualquier día de la semana, pero sin exceder la semana actual (sábados y domingos), lo tengo cubierto con este código.

public static DateTime GetDateInCurrentWeek(this DateTime date, DayOfWeek day) { var temp = date; var limit = (int)date.DayOfWeek; var returnDate = DateTime.MinValue; if (date.DayOfWeek == day) return date; for (int i = limit; i < 6; i++) { temp = temp.AddDays(1); if (day == temp.DayOfWeek) { returnDate = temp; break; } } if (returnDate == DateTime.MinValue) { for (int i = limit; i > -1; i++) { date = date.AddDays(-1); if (day == date.DayOfWeek) { returnDate = date; break; } } } return returnDate; }


Un poco más verboso y conciente de la cultura:

System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture; DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek; DayOfWeek today = DateTime.Now.DayOfWeek; DateTime sow = DateTime.Now.AddDays(-(today - fdow)).Date;


Usando Fluent DateTime :

var monday = DateTime.Now.Previous(DayOfWeek.Monday); var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);


Utilice un método de extensión. Son la respuesta a todo, ya sabes! ;)

public static class DateTimeExtensions { public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) { int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7; return dt.AddDays(-1 * diff).Date; } }

Que se puede utilizar de la siguiente manera:

DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday); DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);


intente con esto en c #. Con este código puede obtener la primera fecha y la última fecha de una semana determinada. Aquí el domingo es el primer día y el sábado es el último día, pero puede configurar los dos días según su cultura

DateTime firstDate = GetFirstDateOfWeek(DateTime.Parse("05/09/2012").Date,DayOfWeek.Sunday); DateTime lastDate = GetLastDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Saturday); public static DateTime GetFirstDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay) { DateTime firstDayInWeek = dayInWeek.Date; while (firstDayInWeek.DayOfWeek != firstDay) firstDayInWeek = firstDayInWeek.AddDays(-1); return firstDayInWeek; } public static DateTime GetLastDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay) { DateTime lastDayInWeek = dayInWeek.Date; while (lastDayInWeek.DayOfWeek != firstDay) lastDayInWeek = lastDayInWeek.AddDays(1); return lastDayInWeek; }


Para el lunes

DateTime startAtMonday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek);

Para el domingo

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);


namespace DateTimeExample { using System; public static class DateTimeExtension { public static DateTime GetMonday(this DateTime time) { if (time.DayOfWeek != DayOfWeek.Monday) return GetMonday(time.AddDays(-1)); //Recursive call return time; } } internal class Program { private static void Main() { Console.WriteLine(DateTime.Now.GetMonday()); Console.ReadLine(); } } }


d = DateTime.Now; int dayofweek =(int) d.DayOfWeek; if (dayofweek != 0) { d = d.AddDays(1 - dayofweek); } else { d = d.AddDays(-6); }


public static System.DateTime getstartweek() { System.DateTime dt = System.DateTime.Now; System.DayOfWeek dmon = System.DayOfWeek.Monday; int span = dt.DayOfWeek - dmon; dt = dt.AddDays(-span); return dt; }


using System; using System.Globalization; namespace MySpace { public static class DateTimeExtention { // ToDo: Need to provide culturaly neutral versions. public static DateTime GetStartOfWeek(this DateTime dt) { DateTime ndt = dt.Subtract(TimeSpan.FromDays((int)dt.DayOfWeek)); return new DateTime(ndt.Year, ndt.Month, ndt.Day, 0, 0, 0, 0); } public static DateTime GetEndOfWeek(this DateTime dt) { DateTime ndt = dt.GetStartOfWeek().AddDays(6); return new DateTime(ndt.Year, ndt.Month, ndt.Day, 23, 59, 59, 999); } public static DateTime GetStartOfWeek(this DateTime dt, int year, int week) { DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7); return dayInWeek.GetStartOfWeek(); } public static DateTime GetEndOfWeek(this DateTime dt, int year, int week) { DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7); return dayInWeek.GetEndOfWeek(); } } }


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