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
}
}
Date target = new Date(2011, 4, 1);
while (target < Date.Today) {
// do something with target.Month and target.Year
target = target.AddMonths(1);
}
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. :)
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);
}
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)
while (startDate <= DateTime.Now)
{
//here you will get every new month in year
Console.WriteLine(startDate.Month);
//Add Month
startDate=startDate.AddMonths(1);
}