Comment puis-je obtenir le DateTime pour le début de la semaine?

Comment puis-je trouver le début de la semaine (dimanche et lundi) connaissant uniquement l’heure actuelle en C #?

Quelque chose comme:

DateTime.Now.StartWeek(Monday); 

Utilisez une méthode d’extension. Ils sont la réponse à tout, vous savez! 😉

 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; } } 

Qui peut être utilisé comme suit:

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

Un peu plus verbeux et conscient de la culture:

 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; 

Le moyen le plus rapide pour moi est de:

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

Si vous souhaitez que tout autre jour de la semaine soit votre date de début, il vous suffit d’append la valeur de DayOfWeek à la fin.

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

Utiliser Fluent DateTime :

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

Moche mais ça donne au moins les bonnes dates

Avec début de semaine défini par système:

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

Sans pour autant:

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

Combinons la réponse sans danger pour la culture et la méthode d’extension:

 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)); } } 

Cela peut être un peu un piratage, mais vous pouvez convertir la propriété .DayOfWeek en un int (c’est un enum et puisque son type de données sous-jacent n’a pas été modifié par défaut à int) et l’utiliser pour déterminer le début de semaine précédent .

Il semble que la semaine spécifiée dans l’énumération DayOfWeek commence le dimanche, donc si nous soustrayons 1 de cette valeur, cela sera égal au nombre de jours que le lundi est avant la date actuelle. Nous devons également cartographier le dimanche (0) pour qu’il soit égal à 7, soit 1 – 7 = -6 le dimanche sera mis en correspondance avec le lundi précédent: –

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

Le code du dimanche précédent est plus simple car nous n’avons pas à faire cet ajustement: –

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

Cela vous donnerait le dimanche précédent (je pense):

 DateTime t = DateTime.Now; t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0); 
 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(); } } } 

Rassembler tout cela, avec la mondialisation et en permettant de spécifier le premier jour de la semaine dans le cadre de l’appel que nous avons

 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; } 
 var now = System.DateTime.Now; var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date; 

Cela vous donnerait minuit le premier dimanche de la semaine:

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

Cela vous donne le premier lundi à minuit:

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

Essayé plusieurs fois mais n’a pas résolu le problème avec une semaine commençant un lundi, ce qui m’a donné le lundi suivant un dimanche. Je l’ai donc modifié un peu et l’ai fait fonctionner avec ce code:

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

La méthode suivante doit renvoyer le DateTime souhaité. Passez à vrai pour dimanche étant le premier jour de la semaine, faux pour lundi:

 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); } 

Merci pour les exemples. Je devais toujours utiliser le premier jour de la semaine “CurrentCulture” et pour un tableau, je devais connaître le numéro de jour exact, donc voici mes premières extensions:

 public static class DateTimeExtensions { //http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week //http://stackoverflow.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 } } 

essayez avec ceci dans c # .Avec ce code, vous pouvez obtenir la première date et la dernière date d’une semaine donnée.Si le dimanche est le premier jour et le samedi est le dernier jour, mais vous pouvez définir les deux jours en fonction de votre culture

 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; } 

Personne ne semble avoir répondu correctement à cette question. Je vais coller ma solution ici au cas où quelqu’un en aurait besoin. Le code suivant fonctionne indépendamment du fait que le premier jour de la semaine soit un lundi ou un dimanche ou autre chose.

 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()); } } 

Modulo en C # fonctionne mal pour -1mod7 (devrait être 6, c # renvoie -1) alors … “oneliner” solution à ceci ressemblera à ceci 🙂

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

Vous pouvez utiliser l’excellente bibliothèque Umbrella :

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

Cependant, ils semblent avoir stocké lundi comme premier jour de la semaine (voir la propriété nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn ), de sorte que la solution localisée précédente est un peu meilleure. Malheureux.

Edit : en regardant de plus près la question, il semble que Umbrella pourrait aussi fonctionner pour cela:

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

Bien que cela vaut la peine de noter que si vous demandez le lundi précédent un lundi, cela vous donnera sept jours en arrière. Mais cela est également vrai si vous utilisez BeginningOfWeek , qui semble être un bogue :(.

Cela renverra à la fois le début de la semaine et les dates de fin de semaine:

  private ssortingng[] GetWeekRange(DateTime dateToCheck) { ssortingng[] result = new ssortingng[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.ToSsortingng(); result[1] = dateRangeEnd.Date.ToSsortingng(); return result; } 

J’ai posté le code complet pour le calcul du début / fin de semaine, mois, sortingmestre et année sur mon blog ZamirsBlog

  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(); } } } 

Même chose pour la fin de semaine (dans le style de @Comstack C’est la réponse):

  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) { }; } 

Voici une combinaison de quelques réponses. Il utilise une méthode d’extension qui permet de transmettre la culture, si aucune culture n’est transmise, la culture actuelle est utilisée. Cela lui donnera une flexibilité maximale et une réutilisation.

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

Exemple d’utilisation:

 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.ToShortDateSsortingng()} First Day of week: {date.StartOfWeek(culture).ToShortDateSsortingng()}"); } } 

Si vous voulez samedi ou dimanche ou n’importe quel jour de la semaine mais ne dépassant pas la semaine en cours (samedi-dimanche), je vous ai couvert avec ce morceau de code.

 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; } 
  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; }