web-dev-qa-db-fra.com

moyen facile de passer en revue les mois et les années à partir d'une date donnée

J'ai essayé d'écrire cette boucle et cela ne cesse de se compliquer. En gros, je veux prendre une date donnée et la parcourir tous les mois jusqu'à atteindre le mois en cours. Donc, si la date de début est le 01/11/2011, alors je veux passer en boucle

11/2011, 12/2011, 1/2012, 2/2012, etc.

Voici ce que j'ai commencé avec mais cela ne fonctionne pas. Une fois que je frappe une nouvelle année, j'ai besoin de la boucle intérieure pour recommencer avec 1 pas startdate.Month. Existe-t-il en général une meilleure façon de parcourir les mois et les années? Merci

        for (var y = startdate.Year; y <= DateTime.Now.Year; y++)
        {
            for (var m = startdate.Month; m <= 12; m++)
            {
                  //do something with m and y
            }
        }
15
Rochelle C
Date target = new Date(2011, 4, 1);
while (target < Date.Today) {
  // do something with target.Month and target.Year
  target = target.AddMonths(1);
}
26
Sam Axe
DateTime endDate = DateTime.Today;
for (DateTime dt = startDate; dt <= endDate; dt = dt.AddMonths(1))
{
    Console.WriteLine("{0:M/yyyy}", dt);
}

Mais si vous préférez les boucles while, votez pour Dan-o. J'ai fait. :)

7
Matt Johnson

Cela fera une boucle sur les mois et le jour du mois ne sera pas un problème.

var date = startDate;
var endDate = DateTime.Now;

while(date.Year < endDate.Year || (date.Year == endDate.Year && date.Month <= endDate.Month))
{
    Console.WriteLine($"{date.Month}/{date.Year}");
    date = date.AddMonths(1);
}
1
Hüseyin Yağlı

Générez une plage (comme IEnumerable`DateTime) des premiers jours d'un mois entre des dates données:

from range in new[] {
    new {
        start = new DateTime(2017, 6, 23),
        end = new DateTime(2018, 09, 11)
    }
}
select (
    from y in Enumerable.Range(
        range.start.Year, range.end.Year - 
        range.start.Year + 1
    )
    let ms = y == range.start.Year ? range.start.Month : 1
    let me = y == range.end.Year ? range.end.Month : 12
    select 
        from m in Enumerable.Range(ms, me - ms + 1)
        select new DateTime(y, m, 1)
).SelectMany(y => y)
0
esteewhy
while (startDate <= DateTime.Now)
            {
                //here you will get every new month in  year
                Console.WriteLine(startDate.Month);
                //Add Month
                startDate=startDate.AddMonths(1);
            }
0