Получать все месячные имена между двумя датами
Я пытаюсь создать функцию, которая дает имя месяца между двумя датами в С#
List<string> liMonths = MyFunction(date1,date2);
моя функция
MyFunction(DateTime date1,DateTime date2)
{
//some code
return listOfMonths;
}
Можете ли вы мне помочь, как я могу это сделать
Ответы
Ответ 1
Нет linq-решения еще?
var start = new DateTime(2013, 1, 1);
var end = new DateTime(2013, 6, 22);
// set end-date to end of month
end = new DateTime(end.Year, end.Month, DateTime.DaysInMonth(end.Year, end.Month));
var diff = Enumerable.Range(0, Int32.MaxValue)
.Select(e => start.AddMonths(e))
.TakeWhile(e => e <= end)
.Select(e => e.ToString("MMMM"));
Ответ 2
Создать цикл начинается с даты1 до даты2. Добавьте один месяц для каждого шага цикла и заполните возвращаемую переменную месяц.
Я пытаюсь написать на метаязыке вашу цель:
DateTime currDate = date1
List myList = new List();
while (currDate < date2) {
myList.add(getMonthName(currDate));
currDate = currDate.addMonth(1);
}
Ответ 3
Вы можете использовать Linq со вспомогательной функцией
IEnumerable<DateTime> GetDates(DateTime date1, DateTime date2)
{
while (date1 <= date2)
{
yield return date1;
date1 = date1.AddMonths(1);
}
if (date1 > date2)
{
// Include the last month
yield return date1;
}
}
Тогда MyFunction может быть одним из следующих
1) Включить название года
List<string> MyFunction(DateTime date1, DateTime date2) {
return GetDates(date1,date2).Select(x => x.ToString("MMMM yyyyy")).ToList();
}
2) Только имя месяца с дубликатами
List<string> MyFunction(DateTime date1, DateTime date2) {
return GetDates(date1,date2).Select(x => x.ToString("MMMM")).ToList();
}
3) Разные названия месяцев
List<string> MyFunction(DateTime date1, DateTime date2) {
return GetDates(date1,date2).Select(x => x.ToString("MMMM")).Distinct().ToList();
}
Ответ 4
DateTime from;
DateTime to;
var source = from.Month > to.Month ?
Enumerable.Range(from, 12).Concat(Enumerable.Range(1, to.Month))
: Enumerable.Range(1, 12)
.SkipWhile(m => m >= from.Month)
.TakeWhile(m => m <= to.Month)
var monthes = source
.Select(m => CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(m));
Ответ 5
List<string> MonthNames(DateTime date1, DateTime date2)
{
var monthList = new List<string>();
while (date1 < date2)
{
monthList.Add(date1.ToString("MMMM/yyyy"));
date1 = date1.AddMonths(1);
}
return monthList;
}
Ответ 6
static IEnumerable<DateTime> monthsBetween(DateTime d0, DateTime d1)
{
return Enumerable.Range(0, (d1.Year - d0.Year) * 12 + (d1.Month - d0.Month + 1))
.Select(m => new DateTime(d0.Year, d0.Month, 1).AddMonths(m));
}
Ответ 7
Здесь вам нужен один лайнер.
var date1 = new DateTime(2013, 02, 17);
var date2 = new DateTime(2013, 09, 06);
var monthsBetween = DateTimeFormatInfo.CurrentInfo.MonthNames.Where((_, i) => ++i >= date1.Month && i <= date2.Month);
Ответ 8
private static List<string> MyFunction(DateTime date1, DateTime date2)
{
var listOfMonths=new List<string>();
if (date1.CompareTo(date2) == 1)
{
var temp = date2;
date2 = date1;
date1 = temp;
}
var mosSt = date1.Month;
var mosEn = date2.Month;
var yearSt = date1.Year;
var yearEn = date2.Year;
while (mosSt < mosEn || yearSt < yearEn)
{
var temp = new DateTime(yearSt, mosSt, 1);
listOfMonths.Add(temp.ToString("MMMM", CultureInfo.InvariantCulture));
mosSt++;
if (mosSt < 13) continue;
yearSt++;
mosSt = 1;
}
return listOfMonths;
}