Как узнать временной отрезок между текущей датой и прошлой (кол-во месяцев, годов)?

infinit

Client
Регистрация
02.04.2016
Сообщения
163
Благодарностей
13
Баллы
18
Всем привет!
Помогите с решением данной задачи, пожалуйста!

У меня есть даты в формате:

27.02.14
11.07.15
18.11.16
......
......
14.07.14

и т.д. Мне необходимо сравнить их с сегодняшней датой (допустим 23.03.2017) или могу вывести это в переменную и буду вписывать сегодняшнюю дату 23.03.17.

Как мне сравнить эти значения, чтобы на выходе получить кол-во месяцев, лет.
Пример:

23.03.17 - 27.02.14 = ? // (кол-во месяцев, лет)
 
  • Спасибо
Реакции: Mikhail B.

alekwuy

Client
Регистрация
06.04.2013
Сообщения
1 631
Благодарностей
461
Баллы
83
на С# есть что то типа unixtime там можно такое сделать)
но я не умею)
 

infinit

Client
Регистрация
02.04.2016
Сообщения
163
Благодарностей
13
Баллы
18
Помогите кто-то, пожалуйста, готов даже отблагодарить символической суммой))
 

copper12

Client
Регистрация
26.11.2016
Сообщения
1 111
Благодарностей
260
Баллы
63

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
Разница в днях
C#:
DateTime oldDate = DateTime.Parse(project.Variables["OldDate"].Value);
DateTime nowDate = DateTime.Now;
TimeSpan ts = nowDate - oldDate;
return ts.Days;
 
  • Спасибо
Реакции: infinit

infinit

Client
Регистрация
02.04.2016
Сообщения
163
Благодарностей
13
Баллы
18
Разница в днях
C#:
DateTime oldDate = DateTime.Parse(project.Variables["OldDate"].Value);
DateTime nowDate = DateTime.Now;
TimeSpan ts = nowDate - oldDate;
return ts.Days;
Предварительно передал глобальную переменную проекта "age" (значение: 27.02.14) в переменную кубика и вот конечный код:

Код:
var oldDate = project.Variables["age"].Value;
DateTime oldDate = DateTime.Parse(project.Variables["oldDate"].Value);
DateTime nowDate = DateTime.Now;
TimeSpan ts = nowDate - oldDate;
return ts.Days;

Однако вот что получилось
 

infinit

Client
Регистрация
02.04.2016
Сообщения
163
Благодарностей
13
Баллы
18
Пардон, поправил на такой вариант:

Код:
DateTime oldDate = DateTime.Parse(project.Variables["age"].Value);
DateTime nowDate = DateTime.Now;
TimeSpan ts = nowDate - oldDate;
return ts.Days;

И результат:

upload_2017-3-23_14-10-25.png
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
А в переменной age есть вообще значение в формате, как в первом посте?
 
  • Спасибо
Реакции: infinit

infinit

Client
Регистрация
02.04.2016
Сообщения
163
Благодарностей
13
Баллы
18
А в переменной age есть вообще значение?
Да, было но по ошибке немного не тот формат был!
Теперь все работает!

upload_2017-3-23_14-14-47.png


Спасибо огромное!
Вопросик: как сделать return не в лог, а в переменную проекта, допустим "date_result"?
И чтобы потом была выгрузка из локальной переменной кубика C# в глобальную переменную проекта, спасибо!
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
return ts.Days;
замени на
project.Variables["date_result"].Value = ts.Days.ToString();
 
  • Спасибо
Реакции: infinit

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
По поводу глобальных переменных сюда.
 
  • Спасибо
Реакции: infinit

infinit

Client
Регистрация
02.04.2016
Сообщения
163
Благодарностей
13
Баллы
18
Выражаю огромную благодарность Dimionix и всем, кто поддержал в решении проблемы!
Всем хорошего дня! :az:
 
  • Спасибо
Реакции: copper12

Alexander I

Client
Регистрация
04.11.2016
Сообщения
32
Благодарностей
3
Баллы
8
А можете подсказать такой код только для минут. Чтобы реализовать следующее:

Проект зациклен внутри себя на N повторов.

Нужно записать время начала выполнения проекта. Потом время, когда прошел один из повторов в цикле. То есть, когда один из циклов успешно выполнен.

Далее нужно время, что ушло на выполнение проекта сравнить с заданным в настройках. И если оно меньше чем нужно (цикл выполнился быстрей), то подождать столько-то дополнительного времени. Если выполнился во время или даже дольше чем планировалось, то все ок и переходит к выполнению следующего цикла.

Запуск через планировщик тут не сработает. Так как, необходимо, чтобы проектор работал в цикле внутри себя, иначе не хватает ресурсов на нужное количество потоков, а сервер и так один из самых мощных.

Заранее спасибо за помощь!

Александр.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
А можете подсказать такой код только для минут.
1. В начале выполнения проекта кладешь значение TickCount в переменную StartTime - переменная окружения {-Environment.TickCount-} или код
C#:
return Environment.TickCount;
2. После цикла вставляешь кубик с кодом
C#:
int refTime = int.Parse(project.Variables["RefTime"].Value) * 60 * 1000; // время, заданное в настройках
int startTime = int.Parse(project.Variables["StartTime"].Value); // время начала выполнения проекта
int endTime = Environment.TickCount; // время, когда прошел один из повторов в цикле

int elapsedTime = endTime - startTime; // вычисляем время, затраченное на выполнение проекта
// Сравниваем время, затраченное на выполнение проекта с временем, заданным в настройках, если оно больше, то "ok"
if (elapsedTime < refTime) {
    int pause = refTime - elapsedTime; // ...если меньше, то вычисляем время для паузы (время, заданное в настройках минус время, затраченное на выполнение проекта)
    Thread.Sleep(pause); // пауза
}
 
Последнее редактирование:
  • Спасибо
Реакции: Alexander I

Alexander I

Client
Регистрация
04.11.2016
Сообщения
32
Благодарностей
3
Баллы
8
1. В начале выполнения проекта кладешь значение TickCount в переменную StartTime - переменная окружения {-Environment.TickCount-} или код
C#:
return Environment.TickCount;
2. После цикла вставляешь кубик с кодом
C#:
int refTime = int.Parse(project.Variables["RefTime"].Value) * 60 * 1000; // время, заданное в настройках
int startTime = int.Parse(project.Variables["StartTime"].Value); // время начала выполнения проекта
int endTime = Environment.TickCount; // время, когда прошел один из повторов в цикле

int elapsedTime = endTime - startTime;
if (elapsedTime < refTime) {
    int pause = refTime - elapsedTime;
    Thread.Sleep(pause);
}
Огромное спасибо за помощь!

У меня вопрос про RefTime. Это переменная, в которой я указую сколько минут должен был выполнятся проект, правильно?
Например, 5 минут.

И если он выполнялся меньше 5 минут, то будет задержка пока не набереться 5 минут. А если проект выполнялся 5 минут и больше, то сразу пойдет новый цикл. Я правильно понял?

Заранее спасибо за разъяснения. Очень хотелось бы самому понять код, чтобы в дальнейшем не задавать глупых вопросов. :-)

Александр.
 
  • Спасибо
Реакции: Dimionix

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
  • Спасибо
Реакции: Alexander I

Alexander I

Client
Регистрация
04.11.2016
Сообщения
32
Благодарностей
3
Баллы
8

Alexander I

Client
Регистрация
04.11.2016
Сообщения
32
Благодарностей
3
Баллы
8
  • Спасибо
Реакции: Dimionix

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