Вопрос с месяцами. Как создать список?

Vladimirvolga

Пользователь
Регистрация
29.06.2017
Сообщения
134
Благодарностей
10
Баллы
18
Друзья, добрый вечер!
Есть переменная, в которой лежат начало и конец периода:
март 2010
февраль 2017
Необходимо создать список расширенный примерно такого вида:
март 2010
апрель 2010
май 2010
...
...
...
февраль 2017
Как это можно реализовать? "март 2010" можно положить в переменную, а как сделать, чтобы программа к этой переменной прибавила 1 и на выходе получился бы "апрель 2010"?

Спасибо заранее!
:-)
 

emel

Client
Регистрация
21.02.2015
Сообщения
86
Благодарностей
18
Баллы
8
Сделайте список в екселе и не ломайте голову.)
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Захотелось попробовать смогу ли такое замутить. получилось!
C#:
string Date_Start = project.Variables["Date_Start"].Value; // вносим переменные в проект (март 2010)
string Date_Finish = project.Variables["Date_Finish"].Value;  // вносим переменные в проект (август 2010)
DateTime Date_Start_classic = Convert.ToDateTime(Date_Start); // преобразуем переменную в структуру "время"

// в блоке ниже добавляем построчно месяцы пока не встретим финишную дату, либо не дойдем до 10000 строк (защита от "дурака")
string Diapazon = Date_Start + "\r\n";
int i = 0;
int proverka = 0;
while (proverka != 1 & i < 10000) {
    i++;
    DateTime newDate = Date_Start_classic.AddMonths(i);
    string newDate2 = newDate.ToString("MMMM yyyy");
    newDate2 = newDate2.ToLower(); // поскольку C# выдает дату в формате «Март 2010», то переводим в нижний регистр («март 2010»)
    if (newDate2 == Date_Finish)
    {
        proverka = 1;
    }
    Diapazon += newDate2 + "\r\n";
}

// возвращаем наш список-диапазон в виде переменной на несколько строк
return Diapazon;
Результат:
март 2010
апрель 2010
май 2010
июнь 2010
июль 2010
август 2010
Использовались отрывки из источников:
https://msdn.microsoft.com/ru-ru/library/system.datetime.addmonths(v=vs.110).aspx
https://msdn.microsoft.com/ru-ru/library/system.datetime(v=vs.110).aspx
http://www.cyberforum.ru/csharp-beginners/thread252837.html
 
  • Спасибо
Реакции: Vladimirvolga

Vladimirvolga

Пользователь
Регистрация
29.06.2017
Сообщения
134
Благодарностей
10
Баллы
18
Захотелось попробовать смогу ли такое замутить. получилось!
C#:
string Date_Start = project.Variables["Date_Start"].Value; // вносим переменные в проект (март 2010)
string Date_Finish = project.Variables["Date_Finish"].Value;  // вносим переменные в проект (август 2010)
DateTime Date_Start_classic = Convert.ToDateTime(Date_Start); // преобразуем переменную в структуру "время"

// в блоке ниже добавляем построчно месяцы пока не встретим финишную дату, либо не дойдем до 10000 строк (защита от "дурака")
string Diapazon = Date_Start + "\r\n";
int i = 0;
int proverka = 0;
while (proverka != 1 & i < 10000) {
    i++;
    DateTime newDate = Date_Start_classic.AddMonths(i);
    string newDate2 = newDate.ToString("MMMM yyyy");
    newDate2 = newDate2.ToLower(); // поскольку C# выдает дату в формате «Март 2010», то переводим в нижний регистр («март 2010»)
    if (newDate2 == Date_Finish)
    {
        proverka = 1;
    }
    Diapazon += newDate2 + "\r\n";
}

// возвращаем наш список-диапазон в виде переменной на несколько строк
return Diapazon;
Результат:

Использовались отрывки из источников:
https://msdn.microsoft.com/ru-ru/library/system.datetime.addmonths(v=vs.110).aspx
https://msdn.microsoft.com/ru-ru/library/system.datetime(v=vs.110).aspx
http://www.cyberforum.ru/csharp-beginners/thread252837.html

Ого! Еще бы разобраться с этим...
:-)
 

Vladimirvolga

Пользователь
Регистрация
29.06.2017
Сообщения
134
Благодарностей
10
Баллы
18
Захотелось попробовать смогу ли такое замутить. получилось!
C#:
string Date_Start = project.Variables["Date_Start"].Value; // вносим переменные в проект (март 2010)
string Date_Finish = project.Variables["Date_Finish"].Value;  // вносим переменные в проект (август 2010)
DateTime Date_Start_classic = Convert.ToDateTime(Date_Start); // преобразуем переменную в структуру "время"

// в блоке ниже добавляем построчно месяцы пока не встретим финишную дату, либо не дойдем до 10000 строк (защита от "дурака")
string Diapazon = Date_Start + "\r\n";
int i = 0;
int proverka = 0;
while (proverka != 1 & i < 10000) {
    i++;
    DateTime newDate = Date_Start_classic.AddMonths(i);
    string newDate2 = newDate.ToString("MMMM yyyy");
    newDate2 = newDate2.ToLower(); // поскольку C# выдает дату в формате «Март 2010», то переводим в нижний регистр («март 2010»)
    if (newDate2 == Date_Finish)
    {
        proverka = 1;
    }
    Diapazon += newDate2 + "\r\n";
}

// возвращаем наш список-диапазон в виде переменной на несколько строк
return Diapazon;
Результат:

Использовались отрывки из источников:
https://msdn.microsoft.com/ru-ru/library/system.datetime.addmonths(v=vs.110).aspx
https://msdn.microsoft.com/ru-ru/library/system.datetime(v=vs.110).aspx
http://www.cyberforum.ru/csharp-beginners/thread252837.html
Я бы попробовал что-то попроще.
Если не трудно, как перевести дату, скажем, 15 марта 2010 года в юникстайм? И обратно?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Я конечно не шарю особо в C#, просто иногда допиливаю свои алгоритмы в нем, исходя из кусочков кода в сети... но из чего вы взяли, что есть вариант попроще?
Если не трудно, как перевести дату, скажем, 15 марта 2010 года в юникстайм? И обратно?
Для этого есть много примеров в поиске по форуму:
https://www.google.com.ua/search?num=100&newwindow=1&hl=en&gbv=2&q=как+перевести+дату+в+юникс+тайм+site:zennolab.com&spell=1&sa=X&ved=0ahUKEwi4yZjnjYfVAhXCBZoKHUMnBB4QBQgiKAA&biw=1880&bih=970
Либо в сети гуглите, я вот нашел и использовал вот такой:
https://stackoverflow.com/a/35425123/7355688

Но, как говорится:


юникстайм удобен, когда найдо найти разницу между двумя датами (тупо в секундах считает). Но я не видел в сети примеров как увеличить его на 1 календарный месяц. Но если хотите в нем, то пожалуйста. Вот тот же аналог кода, но с никому нафиг ненужным юникстаймом, и разжеванными комментариями. Я даже закомментировал (заменил) шаг сравнения времени на юникстаймовское.

C#:
// Блок 1. Работа с основными переменными
string Date_Start = project.Variables["Date_Start"].Value; // вносим переменные в проект (март 2010)
string Date_Finish = project.Variables["Date_Finish"].Value;  // вносим переменные в проект (август 2010)
DateTime Date_Start_classic = Convert.ToDateTime(Date_Start); // преобразуем переменную в структуру "время"
DateTime Date_Finish_classic = Convert.ToDateTime(Date_Finish); // преобразуем переменную в структуру "время"
long Date_Start_classic_unixTime = ((DateTimeOffset)Date_Start_classic).ToUnixTimeSeconds(); // преобразуем переменную в структуру "unix время", но хз нафига
long Date_Finisht_classic_unixTime = ((DateTimeOffset)Date_Finish_classic).ToUnixTimeSeconds(); // преобразуем переменную в структуру "unix время",  но хз нафига

// Блок 2. в блоке ниже  добавляем построчно месяцы пока не встретим финишную дату, либо не дойдем до 10000 строк (защита от "дурака")
string Diapazon = Date_Start + "\r\n";
int i = 0;
int proverka = 0;
// начало цикла увеличения даты на 1 месяц
while (proverka != 1 & i < 10000) {
    i++;
    DateTime newDate = Date_Start_classic.AddMonths(i); // здесь идет добавление одного месяца к дате. На unixTime такую операцию не сделать, там можно добавлять секунды, но не календарный месяц (в месяцах разное количество секунд\дней).
    string newDate2 = newDate.ToString("MMMM yyyy"); // здесь можно настроить вывод в любом удобном формате, для этого просто замените "MMMM yyyy" на "dd.MM.yyyy HH:mm:ss" и т.д.
    newDate2 = newDate2.ToLower(); // поскольку C# выдает дату в формате «Март 2010», то переводим в нижний регистр («март 2010»)
// старый шаг проверки ниже я закомментировал, вместо него ниже идет проверки по unixTime
/*
    if (newDate2 == Date_Finish) // если наша текущая увеличенная дата равна финальной дате, то устанавливаем переменной "proverka" значение 1, и это остановит цикл увеличения даты
    {
        proverka = 1;
    }
*/
long newDate_unixTime = ((DateTimeOffset)newDate).ToUnixTimeSeconds(); // преобразуем переменную в структуру "unix время",  и будем сравнивать по ней
    if (newDate_unixTime >= Date_Finisht_classic_unixTime) // если наша текущая увеличенная дата в unix-формате больше\равно финальной даты (в том же unix-формате) то устанавливаем переменной "proverka" значение 1, и это остановит цикл увеличения даты
    {
        proverka = 1;
    }

    Diapazon += newDate2 + "\r\n";
}
// конец цикла увеличения даты на 1 месяц

// возвращаем наш список-диапазон в виде переменной на несколько строк
return Diapazon;
 
Последнее редактирование:
  • Спасибо
Реакции: Vladimirvolga

Vladimirvolga

Пользователь
Регистрация
29.06.2017
Сообщения
134
Благодарностей
10
Баллы
18
Я конечно не шарю особо в C#, просто иногда допиливаю свои алгоритмы в нем, исходя из кусочков кода в сети... но из чего вы взяли, что есть вариант попроще?


Для этого есть много примеров в поиске по форуму:
https://www.google.com.ua/search?num=100&newwindow=1&hl=en&gbv=2&q=как+перевести+дату+в+юникс+тайм+site:zennolab.com&spell=1&sa=X&ved=0ahUKEwi4yZjnjYfVAhXCBZoKHUMnBB4QBQgiKAA&biw=1880&bih=970
Либо в сети гуглите, я вот нашел и использовал вот такой:
https://stackoverflow.com/a/35425123/7355688

Но, как говорится:


юникстайм удобен, когда найдо найти разницу между двумя датами (тупо в секундах считает). Но я не видел в сети примеров как увеличить его на 1 календарный месяц. Но если хотите в нем, то пожалуйста. Вот тот же аналог кода, но с никому нафиг ненужным юникстаймом, и разжеванными комментариями. Я даже закомментировал (заменил) шаг сравнения времени на юникстаймовское.

C#:
// Блок 1. Работа с основными переменными
string Date_Start = project.Variables["Date_Start"].Value; // вносим переменные в проект (март 2010)
string Date_Finish = project.Variables["Date_Finish"].Value;  // вносим переменные в проект (август 2010)
DateTime Date_Start_classic = Convert.ToDateTime(Date_Start); // преобразуем переменную в структуру "время"
DateTime Date_Finish_classic = Convert.ToDateTime(Date_Finish); // преобразуем переменную в структуру "время"
long Date_Start_classic_unixTime = ((DateTimeOffset)Date_Start_classic).ToUnixTimeSeconds(); // преобразуем переменную в структуру "unix время", но хз нафига
long Date_Finisht_classic_unixTime = ((DateTimeOffset)Date_Finish_classic).ToUnixTimeSeconds(); // преобразуем переменную в структуру "unix время",  но хз нафига

// Блок 2. в блоке ниже  добавляем построчно месяцы пока не встретим финишную дату, либо не дойдем до 10000 строк (защита от "дурака")
string Diapazon = Date_Start + "\r\n";
int i = 0;
int proverka = 0;
// начало цикла увеличения даты на 1 месяц
while (proverka != 1 & i < 10000) {
    i++;
    DateTime newDate = Date_Start_classic.AddMonths(i); // здесь идет добавление одного месяца к дате. На unixTime такую операцию не сделать, там можно добавлять секунды, но не календарный месяц (в месяцах разное количество секунд\дней).
    string newDate2 = newDate.ToString("MMMM yyyy"); // здесь можно настроить вывод в любом удобном формате, для этого просто замените "MMMM yyyy" на "dd.MM.yyyy HH:mm:ss" и т.д.
    newDate2 = newDate2.ToLower(); // поскольку C# выдает дату в формате «Март 2010», то переводим в нижний регистр («март 2010»)
// старый шаг проверки ниже я закомментировал, вместо него ниже идет проверки по unixTime
/*
    if (newDate2 == Date_Finish) // если наша текущая увеличенная дата равна финальной дате, то устанавливаем переменной "proverka" значение 1, и это остановит цикл увеличения даты
    {
        proverka = 1;
    }
*/
long newDate_unixTime = ((DateTimeOffset)newDate).ToUnixTimeSeconds(); // преобразуем переменную в структуру "unix время",  и будем сравнивать по ней
    if (newDate_unixTime >= Date_Finisht_classic_unixTime) // если наша текущая увеличенная дата в unix-формате больше\равно финальной даты (в том же unix-формате) то устанавливаем переменной "proverka" значение 1, и это остановит цикл увеличения даты
    {
        proverka = 1;
    }

    Diapazon += newDate2 + "\r\n";
}
// конец цикла увеличения даты на 1 месяц

// возвращаем наш список-диапазон в виде переменной на несколько строк
return Diapazon;

Степан, благодарю вас!
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)