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


469

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

Quelque chose comme:

DateTime.Now.StartWeek(Monday);

Réponses:


746

Utilisez une méthode d'extension. Ils sont la réponse à tout, tu sais! ;)

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

15
Vous pouvez simplifier cela comme suit: int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
Troy

13
Troy, je ne crois pas que votre code fonctionne si la date indiquée est un dimanche et que votre début de semaine est le lundi. Il reviendra (dimanche + 1) au lieu de (dimanche - 6)
Aaron Hoffman

1
Cela ne fonctionne pas si dtest UTC et est déjà le début de la semaine, par exemple, 2012-09-02 16:00:00Zqui est Mon, 03 Sep 2012 00:00:00en heure locale. Il doit donc se convertir dtà l'heure locale ou faire quelque chose d'un peu plus intelligent. Il devrait également renvoyer le résultat en UTC si l'entrée était UTC.
row1

1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z")renvoie l'équivalent heure locale, et cette méthode renvoie correctement la même heure, comme une heure locale. Si vous utilisez DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()pour passer explicitement l'heure UTC, cette méthode renvoie correctement 6 jours, 16 heures plus tôt, comme heure UTC. Cela fonctionne exactement comme je m'y attendais.
Rawling

1
Ce serait parfois un jour pour moi. Cela a fonctionné pour moi une fois que j'ai supprimé la composante temps dt. J'ai utiliséint diff = dt.Date.DayOfWeek - startOfWeek;
Vincent Saelzler

80

Le moyen le plus rapide que je puisse trouver est:

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

Si vous souhaitez qu'un autre jour de la semaine soit votre date de début, il vous suffit d'ajouter la valeur 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); 

2
les réponses les plus simples sont les meilleures, celle-ci fonctionnait bien, mais la culture en dépendait
Cerveser

7
En Lettonie, la semaine commence le lundi .. En fait .. Je me demande toujours comment une semaine peut commencer le dimanche .. me semble gênant ..;)
0xDEAD BEEF

Cette solution est bonne. De plus, vous pouvez faire le début de la semaine n'importe quel jour en ajoutant la DayOfWeek sur laquelle vous souhaitez commencer. var dimanche = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek); var lundi = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek + (int) DayOfWeek.Monday);
Loligans

7
Ce code ajouté ne fonctionne pas pour la situation décrite par Threezol. Si vous voulez que le début de la semaine soit lundi, dimanche le calcul vous donne le lundi à venir, pas le précédent.
Giovanni B

4
Oui .. Pour dimanche, ça donne le prochain Modnay .. pas le précédent: P
Ajay Aradhya

64

Un peu plus verbeux et sensible à 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;

4
a obtenu une erreur avec ceci: aujourd'hui = DIMANCHE; fdow = LUNDI; (aujourd'hui - fdow) == -1; DateTime.Now.AddDays (- (- 1)). Date == DateTime.Now.AddDays (+1) .Date; 01-02-2010! = 25-01-2010 !!
balexandre

3
Si vous essayez cela un dimanche, il s'agit essentiellement de faire des AddDays (0 - 1) pour en-GB. Il a donc besoin de la déclaration if de @ Sarcastic
Chris S

3
Vous pouvez également obtenir la culture actuelle en utilisant CultureInfo.CurrentCultureau lieu de la retirer du fil comme ça. Cela semble être une façon étrange d'y accéder.
Hank

7
Autre problème: il est dangereux d'appeler la Nowpropriété deux fois. Si l'heure actuelle se passe à minuit (ou minuit) entre les deux appels, la date aura changé.
Jeppe Stig Nielsen

1
Ce que fait réellement cette réponse est la suivante: "à l'intérieur de la semaine .NET actuelle (commençant le dimanche et se terminant le samedi, selon la numérotation de l'énumération DayOfWeek), recherchez le jour de la semaine .NET qui est le premier de la semaine dans la culture actuelle ". Ce n'est probablement pas ce que vous voulez.
Mathieu Renda

36

Utilisation de Fluent DateTime :

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

29
Je détesterais prendre une dépendance juste pour ça. "Connaissez vos dépendances et tuez-les" semble vous venir à l'esprit. :)
Esteban Araya

7
Quelqu'un a-t-il remarqué COMMENT "Fluent" fonctionne? Jetez un œil au code. Il utilise une boucle do ... while. Je ne veux pas l'appeler des noms, mais si je décide de le faire, ce ne sera pas agréable. public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
nsimeonov

10
@nsimeonov c'est open source. n'hésitez pas à fournir une meilleure mise en œuvre plutôt que de jeter des pierres.
Simon

12
Ouais, comme si j'avais tout le temps du monde pour corriger chaque bogue dans tous les logiciels open source du monde ...
nsimeonov

4
J'ai dû faire un commentaire parce que je me suis beaucoup moqué de la plainte concernant l'utilisation d'une boucle "do ... while"! Hilarant! Je n'ai jamais entendu un autre programmeur frémir à propos d'une boucle auparavant. J'adorerais voir le visage de ce clown quand / s'il se rend compte dans quoi son code se compile.
Josh Stodola

22

Moche mais ça donne au moins les bonnes dates

Avec début de semaine réglé par le 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;
    }

3
Cela mérite vraiment plus de votes pour sa simplicité et sa lisibilité.
ProfK

Cette ressource a également aidé: markb.uk/… (Si vous souhaitez obtenir le premier / dernier jour d'une semaine ou d'un mois).
FranzHuber23

13

Combinons la réponse sans danger pour la culture et la réponse de 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));
    }
}

12
ni dt ni startOfWeek n'est utilisé dans votre fonction, je suppose que la première devrait être utilisée à la place de DateTime.Today
hultqvist

2
Le contexte de la question est de vouloir une propriété supplémentaire à utiliser hors de Datetime de la même manière que .Today ou .Now. Je suis d'accord, c'est gênant, mais c'est ce qui a été demandé.
Joel Coehoorn

7
Je sais que c'est une vieille réponse, mais c'est faux à tant de niveaux; en plus d'ignorer totalement les arguments de la méthode, le calcul lui fera choisir une date future dans de nombreux cas. Cela aurait dû être écrit pour utiliser à la dtplace de DateTime.Today, pour envelopper les mathématiques dans un (offset + 7) % 7pour assurer un décalage négatif, pour utiliser une surcharge de méthode à paramètre unique qui passe FirstDayOfWeekl' startOfWeekargument de la culture actuelle et éventuellement (selon la spécification) pour contraindre un décalage de zéro à un décalage de 7 jours, de sorte que «mardi dernier» ne revient pas aujourd'hui si c'est déjà mardi.
Aaronaught

10

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

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

9

Cela peut être un peu un hack, mais vous pouvez convertir la propriété .DayOfWeek en un int (c'est une énumération et comme son type de données sous-jacent n'a pas été modifié, il est par défaut int) et l'utiliser pour déterminer le début de la semaine précédente .

Il semble que la semaine spécifiée dans l'énumération DayOfWeek commence le dimanche, donc si nous soustrayons 1 de cette valeur, ce sera égal au nombre de jours le lundi avant la date actuelle. Nous devons également mapper le dimanche (0) à 7, donc étant donné 1 - 7 = -6, le dimanche sera mappé au 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);

9

Pour lundi

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

Pour dimanche

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

1
J'avais un besoin d'application différent, mais je l'ai utilisé pour me lancer. Je l'aime parce que c'est la plus simple, sans casting - en gardant les opérations dans les mêmes types / appropriés.
qxotk

1
Cela ne fonctionne pas lorsque le jour est dimanche. Il donne le lundi suivant, pas le début de la semaine en cours.
Grant J

Vous avez également copié le dimanche ou le lundi. J'ai 2 réponses Une si vous voulez pour lundi et 2 si vous voulez pour dimanche ..... Je viens de la tester et cela me convient. DateTime.Now.DayOfWeek; Dimanche et résultat DateTime.Now.AddDays (DayOfWeek.Sunday - DateTime.Now.DayOfWeek); {10/11/2019 4:14:55 μμ} Date: {10/11/2019 12:00:00 πμ} Jour: 10 DayOfWeek: Dimanche DayOfYear: 314 Heure: 16 Type: Local Milliseconde: 172 Minute: 14 Mois : 11 Second: 55 Ticks: 637089992951723516 TimeOfDay: {16: 14: 55.1723516} Année: 2019
George Stavrou

@GrantJ Quelle ligne avez-vous prise ??? Je viens de tester et ça marche bien.
George Stavrou

J'ai essayé le premier, en remplaçant votre DateTime.Now par un DateTime représentant le dimanche 10 novembre 2019. Il devrait donner le lundi 4 novembre 2019 mais il donne le lundi 11 novembre 2019. J'ai mis en place un violon pour le démontrer ici: dotnetfiddle.net/ Jw3ZiO
Grant J

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

3
Tout d'abord, bienvenue dans la communauté :) Il existe déjà plusieurs réponses de haute qualité à cette question, dont la plupart ont été publiées il y a sept ans lorsque la question a été posée. Bien qu'il puisse être utile de tenter de répondre à des questions simples comme celle-ci afin de développer vos capacités de programmation, la publication de cette réponse dans son état actuel n'ajoute rien à la question. S'il y a quelque chose de nouveau dans votre réponse, veuillez prendre quelques phrases pour expliquer en quoi elle est différente et pourquoi cela la rend meilleure.
MTCoster

4

Mettre tout cela ensemble, avec la mondialisation et permettre 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;

}

4
var now = System.DateTime.Now;

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

2

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

2

essayez avec cela en c # .Avec ce code, vous pouvez obtenir à la fois la première date et la dernière date d'une semaine donnée.Ici, 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;
}

2

J'ai essayé plusieurs 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;

Il semble que le problème du `` lundi à venir '' dépend de la culture (voir également la réponse d'Eric et le commentaire de Cerveser.) Cependant, si vous n'avez pas besoin de prendre en compte le dimanche (comme pour les rendez-vous d'affaires habituels), votre formule peut simplifié:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Damian Vogel

2

Étape 1: créer une classe statique

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

Étape 2: utilisez cette classe pour obtenir le jour de début et de fin de la semaine

 DateTime dt =TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
        DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);

Fin de semaine requise (6 - (dt.DayOfWeek - startOfWeek)) % 7pour moi contre les tests unitaires que j'ai écrits.
mlhDev

1

La méthode suivante doit renvoyer le DateTime souhaité. Passe 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);
}

1

Merci pour les exemples. J'avais besoin de toujours utiliser le "CurrentCulture" le premier jour de la semaine et pour un tableau, j'avais besoin de connaître le Daynumber exact .. alors 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
    }
}

1

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 peu importe si le premier jour de la semaine est 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());
  }
}

1

Modulo en C # fonctionne mal pour -1mod7 (devrait être 6, c # renvoie -1) donc ... la solution "oneliner" à cela 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));
    }

1

Idem pour la fin de semaine (à la manière de @Compile This's answer):

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

0

Vous pouvez utiliser l'excellente bibliothèque Umbrella :

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

Cependant, ils ne semblent avoir enregistré lundi le 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 mieux. Malheureux.

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

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

Bien qu'il soit intéressant 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, ce qui semble être un bug :(.


0

Cela renverra les dates de début de semaine et de fin de semaine:

    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;

    }

J'ai posté le code complet pour calculer le début / fin de semaine, mois, trimestre et année sur mon blog ZamirsBlog


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

Pouvez-vous développer votre réponse pour inclure une explication de votre code? Cela aide le lecteur plus que vous ne le pensez.
gunr2171

L'utilisation de la récursivité est une implémentation très médiocre. Ce n'est pas parce que vous pouvez utiliser des récursions que vous le devriez. Il serait plus lent et plus gourmand en mémoire que les autres solutions proposées ici.
mikecamimo

0

Voici une combinaison de quelques-unes des réponses. Il utilise une méthode d'extension qui permet à la culture d'être transmise, si aucune n'est transmise, la culture actuelle est utilisée. Cela lui donnera une flexibilité et une réutilisation maximales.

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

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

0

si vous voulez un samedi ou un dimanche ou n'importe quel jour de la semaine sans dépasser 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;
}

0

Nous aimons les lignes simples: obtenez la différence entre le premier jour de la semaine de la culture actuelle et le jour en cours, puis soustrayez le nombre de jours du jour en cours

var weekStartDate = DateTime.Now.AddDays(-((int)now.DayOfWeek - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek));

0

Dans la continuité de Compile This 'Answer, utilisez la méthode suivante pour obtenir la date de n'importe quel jour de la semaine:

public static DateTime GetDayOfWeek(this DateTime dt, DayOfWeek day)
{            
    int diff = (7 + (dt.DayOfWeek - DayOfWeek.Monday)) % 7;
    var monday = dt.AddDays(-1 * diff).Date;

    switch (day)
    {
        case DayOfWeek.Tuesday:
            return monday.AddDays(1).Date;

        case DayOfWeek.Wednesday:
            return monday.AddDays(2).Date;

        case DayOfWeek.Thursday:
            return monday.AddDays(3).Date;

        case DayOfWeek.Friday:
            return monday.AddDays(4).Date;

        case DayOfWeek.Saturday:
            return monday.AddDays(5).Date;

        case DayOfWeek.Sunday:
            return monday.AddDays(6).Date;
    }

    return monday;
}

0

Essayez de créer une fonction qui utilise la récursivité. Votre objet DateTime est une entrée et la fonction renvoie un nouvel objet DateTime qui représente le début de la semaine.

    DateTime WeekBeginning(DateTime input)
    {
        do
        {
            if (input.DayOfWeek.ToString() == "Monday")
                return input;
            else
                return WeekBeginning(input.AddDays(-1));
        } while (input.DayOfWeek.ToString() == "Monday");
    }

Bien que ce code puisse résoudre la question, y compris une explication de comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre message, et entraînerait probablement plus de votes positifs. N'oubliez pas que vous répondrez à la question des lecteurs à l'avenir, pas seulement à la personne qui pose la question maintenant. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limitations et hypothèses applicables.
David Buck

0

Le calcul de cette façon vous permet de choisir quel jour de la semaine indique le début d'une nouvelle semaine (dans l'exemple que j'ai choisi lundi).

Notez que faire ce calcul pour un jour qui est un lundi donnera la lundi actuel et non le précédent.

//Replace with whatever input date you want
DateTime inputDate = DateTime.Now;

//For this example, weeks start on Monday
int startOfWeek = (int)DayOfWeek.Monday;

//Calculate the number of days it has been since the start of the week
int daysSinceStartOfWeek = ((int)inputDate.DayOfWeek + 7 - startOfWeek) % 7;

DateTime previousStartOfWeek = inputDate.AddDays(-daysSinceStartOfWeek);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.