как я могу получить список диапазонов дат между двумя датами
например,
start date
— 12 февраля.end date
— 23 мая
итак, результат должен быть как
12-Feb to 28-Feb
1-Mar to 31-Mar
1-April to 30-April
1-May to 23-May
как я могу получить список диапазонов дат между двумя датами
например,
start date
— 12 февраля.end date
— 23 мая
итак, результат должен быть как
12-Feb to 28-Feb
1-Mar to 31-Mar
1-April to 30-April
1-May to 23-May
Предположим, вы проверяете только один год, то есть текущий (2018).
Конечно, вы можете сделать StartDate
и EndDate
параметрическими.
В приведенном ниже коде нет ничего особенного; Я использовал "d-MMMM"
в качестве формата даты, поскольку вы, казалось, запрашивали минимальное количество дней ("d"
делает это, т.е. выбирает 1
, а не 01
для первого дня месяца) и "длинное" имя месяца («ММММ» делает это, проверьте этот ответ).
Если вместо этого вам просто нужна аббревиатура, то есть «февраль» для «февраль», вы можете использовать «МММ» (проверьте этот другой ответ).
DateTime StartDate = new DateTime(2018, 2, 12);
DateTime EndDate = new DateTime(2018, 5, 23);
for (int i = 0; i <= EndDate.Month - StartDate.Month; i++)
{
DateTime FirstDay = new DateTime(2018, StartDate.Month + i, 1);
if (i == 0)
{
FirstDay = StartDate;
}
DateTime LastDay = new DateTime(2018, StartDate.Month + i, DateTime.DaysInMonth(2018, FirstDay.Month));
if (i == EndDate.Month - StartDate.Month)
{
LastDay = EndDate;
}
Console.WriteLine(FirstDay.ToString("d-MMMM") + " to " + LastDay.ToString("d-MMMM"));
}
Console.ReadLine();
Вы также можете использовать следующий код, чтобы сделать его "перекрестным годом":
static void Main(string[] args)
{
PrintDateList(new DateTime(2018, 2, 12), new DateTime(2018, 5, 23));
PrintDateList(new DateTime(2018, 11, 12), new DateTime(2019, 2, 23));
Console.ReadLine();
}
private static void PrintDateList(DateTime StartDate, DateTime EndDate)
{
Console.WriteLine("");
int TotalMonths = EndDate.Month - StartDate.Month +
(EndDate.Year - StartDate.Year) * 12;
int CurrentYear = StartDate.Year;
int MonthsToSubtract = 0;
for (int i = 0; i <= TotalMonths; i++)
{
int CurrentMonth = StartDate.Month + i;
if (StartDate.Month + i > 12)
{
if ((StartDate.Month + i) % 12 == 1)
{
CurrentYear++;
Console.WriteLine(CurrentYear.ToString());
MonthsToSubtract = StartDate.Month + i - 1;
}
CurrentMonth = StartDate.Month + i - MonthsToSubtract;
}
DateTime FirstDay = new DateTime(CurrentYear, CurrentMonth, 1);
if (i == 0)
{
FirstDay = StartDate;
}
DateTime LastDay = new DateTime(CurrentYear, CurrentMonth, DateTime.DaysInMonth(CurrentYear, FirstDay.Month));
if (i == TotalMonths)
{
LastDay = EndDate;
}
Console.WriteLine(FirstDay.ToString("d-MMMM") + " to " + LastDay.ToString("d-MMMM"));
}
}
Вывод
12-28 февраля
с 1 марта по 31 марта
с 1 апреля по 30 апреля
с 1 мая по 23 маяс 12 ноября по 30 ноября
С 1 декабря по 31 декабря
с 1 января по 31 января
с 1 февраля по 23 февраля
Поскольку вы спросили, я заменил Console.WriteLine
на List
:
private static void PrintDateList(DateTime StartDate, DateTime EndDate)
{
List<Tuple<DateTime>> EventsDatesRangeList = new List<Tuple<DateTime>>();
Console.WriteLine("");
int TotalMonths = EndDate.Month - StartDate.Month +
(EndDate.Year - StartDate.Year) * 12;
int CurrentYear = StartDate.Year;
int MonthsToSubtract = 0;
for (int i = 0; i <= TotalMonths; i++)
{
int CurrentMonth = StartDate.Month + i;
if (StartDate.Month + i > 12)
{
if ((StartDate.Month + i) % 12 == 1)
{
CurrentYear++;
Console.WriteLine(CurrentYear.ToString());
MonthsToSubtract = StartDate.Month + i - 1;
}
CurrentMonth = StartDate.Month + i - MonthsToSubtract;
}
DateTime FirstDay = new DateTime(CurrentYear, CurrentMonth, 1);
if (i == 0)
{
FirstDay = StartDate;
}
DateTime LastDay = new DateTime(CurrentYear, CurrentMonth, DateTime.DaysInMonth(CurrentYear, FirstDay.Month));
if (i == TotalMonths)
{
LastDay = EndDate;
}
Console.WriteLine(FirstDay.ToString("d-MMMM") + " to " + LastDay.ToString("d-MMMM"));
EventsDatesRangeList.Add(new Tuple<DateTime>(FirstDay));
EventsDatesRangeList.Add(new Tuple<DateTime>(LastDay));
}
}
очень приятно, не могли бы вы попробовать эти даты (новый DateTime (2018, 2, 12), новый DateTime (2019, 11, 12)
Я думаю, вы спрашиваете, потому что на февраль 2019 года было 29 дней, верно? Я отредактировал свой код и протестировал его как для 2019, так и для 2020 года (високосный год).
вместо этого я печатаю результат, я сохраняю его в созданном списке
EventsDatesRangeList.Add(новый кортеж<DateTime>(FirstDay)); EventsDatesRangeList.Add(новый кортеж<DateTime>(LastDay));
замените код, затем проверьте результат, код изменит год на 2020 в финале
что за тип EventsDatesRangeList
?
если тип List<Tuple<DateTime>>
, я заменил его в своем коде и отредактировал сообщение. У меня не меняется год.
попробуйте (новый DateTime (2018, 11, 12), новый DateTime (2019, 2, 23)) затем отсортируйте список, и вы увидите, что он перешел на 02.01.2020
результат будет 11.12.2018,30/11/2018,01/12/2018,31/12/2018,01/01/2019,31/01/2019,23/02/2019,1/02/ 2020
Я попробовал даты, которые вы мне дали, но я не получил такого результата, я опубликовал то, что получил, проверьте мой ответ на картинку. Я скопировал и вставил код в свой ответ, а вы?
дорогой, не мог бы ты попробовать 17.01.2016 -- 30.04.2018 через 3 года
все еще пропущено 01-12-2017 -- 31-12-2017
Имея в виду...? Что случилось?
перешел с 01-11-2017 -- 30/11/2017 на 01/01/2018 --31/01/2018, который пропущен 01-12-2017 31-12-2017
Возможный дубликат Как перебрать диапазон дат?
Почему февраль становится февралем, а апрель остается апрелем?
Вам нужно перебрать эти диапазоны или вам просто нужен список с требуемыми датами?
В основном вы создаете DateTime для первого дня и добавляете один день до достижения последнего дня. Используйте AddDays. Google для фрагмента.
цикл по диапазонам
Неясно, на что указывает ваш комментарий «цикл по диапазонам», но похоже, что вы, вероятно, просто хотите рассмотреть три части результата: 1) месяц, который включает в себя начало; 2) месяцы полностью между началом и концом; 3) месяц, который включает конец. Вы можете захотеть обработать «начало и конец в одном месяце» как особый случай для простоты.