Как корректно отсчитывать 5 дней от заданной даты?

spy107

Client
Регистрация
19.08.2012
Сообщения
179
Благодарностей
12
Баллы
18
Здравствуйте. Подскажите пожалуйста умные люди, как отсчитывать корректно 5 дней от заданных дат вида:
06/28/2017 05:39:38
06/29/2017 17:56:28
07/12/2017 19:25:22
07/21/2017 14:01:58
07/28/2017 16:18:29
и т.д.
То есть сначала идёт номер месяца, потом день месяца, потом год, потом время. Вопрос в том, что в месяце может быть разное количество дней (28-31), как с учётом этого корректно отсчитывать заданное количество дней, в моём случае 5 дней ?
 
Последнее редактирование:

spy107

Client
Регистрация
19.08.2012
Сообщения
179
Благодарностей
12
Баллы
18
Извиняюсь, кажется нашёл решение возможное: http://zennolab.com/discussion/threads/schetchik-dnej.39313/#post-291590
Но возникла проблема, не работает этот код, или возможно я не все переменные там верно сделал.
Пишет что строка не распознана как действительное значение DateTime, в чём может быть проблема?
 
Последнее редактирование:

nicanil

Moderator
Команда форума
Регистрация
06.03.2016
Сообщения
790
Благодарностей
730
Баллы
93
C#:
string old_date = project.Variables["old_date"].Value; // в Зенке в переменой "old_date" должна быть наша старая дата "месяц/день/год" ("06/15/2017" )
DateTime date_obj = DateTime.ParseExact(old_date, "MM/dd/yyyy", null);  // Конвертируем строку с датой в объект DateTime.
DateTime new_date = date_obj.AddDays(5);  // Прибавляем к дате 5 дней.
return new_date.ToString(@"MM\/dd\/yyyy");  // Возвращаем дату в формате - "месяц/день/год" ("07/03/2017" )
 

spy107

Client
Регистрация
19.08.2012
Сообщения
179
Благодарностей
12
Баллы
18
  • string old_date = project.Variables["old_date"].Value; // в Зенке в переменой "old_date" должна быть наша старая дата "месяц/день/год" ("06/15/2017" )
  • DateTime date_obj = DateTime.ParseExact(old_date, "MM/dd/yyyy", null); // Конвертируем строку с датой в объект DateTime.
  • DateTime new_date = date_obj.AddDays(5); // Прибавляем к дате 5 дней.
  • return new_date.ToString(@"MM\/dd\/yyyy"); // Возвращаем дату в формате - "месяц/день/год" ("07/03/2017" )
Ошибку выводит: Выполнение действия CSharp OwnCode Строка не распознана как действительное значение DateTime.

Как впрочем и этот код:
Код:
string Time_old = project.Variables["Time_old"].Value; // в Зенке в переменой "Time_old" должна быть наша старая дата "месяц/день/год ..." ("06/15/2017 12:40:41" )
DateTime Time_old_classic = DateTime.ParseExact(Time_old, "MM/dd/yyyy HH:mm:ss", null); // умно парсим дату из нашей переменной формата "месяц/день/год", а то изначально програма ее понимает как набор символов (string) а не как дату.
TimeSpan Time_diff = DateTime.Now - Time_old_classic; // считаем разницу от текущей даты
return Math.Floor(Time_diff.TotalDays); // возвращаем разницу в формате "дни", или замените TotalDays на TotalSeconds (секунды)
Кстати мне больше даже подходит вывод разницы в днях как во втором коде, но он выдаёт такую же ошибку. :(
 

nicanil

Moderator
Команда форума
Регистрация
06.03.2016
Сообщения
790
Благодарностей
730
Баллы
93
Ошибку выводит: Выполнение действия CSharp OwnCode Строка не распознана как действительное значение DateTime
Странно, у меня код работал. Дата точно в формате "07/03/2017" (мм/дд/гггг)?
Сейчас, к сожалению, проверить не могу, только вечером:(
 

spy107

Client
Регистрация
19.08.2012
Сообщения
179
Благодарностей
12
Баллы
18
Странно, у меня код работал. Дата точно в формате "07/03/2017" (мм/дд/гггг)?
Сейчас, к сожалению, проверить не могу, только вечером:(
Похоже проблема не в коде и не в переменных, а в том что у меня версия 5.9.0.1 а не последняя. :(
 

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
216
Баллы
43
Похоже проблема не в коде и не в переменных, а в том что у меня версия 5.9.0.1 а не последняя.
Точно проблема НЕ в версии зенно!!!

Код работает что первый вариант что второй. Смотри внимательно на то в каком формате ты пытаешься распарсить дату.
 

Solus

Client
Регистрация
14.04.2014
Сообщения
362
Благодарностей
113
Баллы
43
Код:
//DateTime olddate = new DateTime();
var olddate = Convert.ToDateTime(project.Variables["date"].Value);
var minus = Convert.ToInt32("-"+project.Variables["minus_5"].Value);
return olddate.AddDays(minus);//.ToString("MM/dd/yyyy");
только если ваша дата (Variables["date"]) на входе идет в формате дд/мм/гггг (18/08/2017 13:40:11)
 
  • Спасибо
Реакции: sydoow

xopek2007

Client
Регистрация
10.05.2013
Сообщения
73
Благодарностей
4
Баллы
8
C#:
string old_date = project.Variables["old_date"].Value; // в Зенке в переменой "old_date" должна быть наша старая дата "месяц/день/год" ("06/15/2017" )
DateTime date_obj = DateTime.ParseExact(old_date, "MM/dd/yyyy", null);  // Конвертируем строку с датой в объект DateTime.
DateTime new_date = date_obj.AddDays(5);  // Прибавляем к дате 5 дней.
return new_date.ToString(@"MM\/dd\/yyyy");  // Возвращаем дату в формате - "месяц/день/год" ("07/03/2017" )
Скажите а как отнять рандомно, например от 5 до 15 дней? Или тут "AddDays(5)" вставить переменную?
 

doc

Client
Регистрация
30.03.2012
Сообщения
7 919
Благодарностей
3 996
Баллы
113
Скажите а как отнять рандомно, например от 5 до 15 дней? Или тут "AddDays(5)" вставить переменную?
C#:
string old_date = project.Variables["old_date"].Value; // в Зенке в переменой "old_date" должна быть наша старая дата "месяц/день/год" ("06/15/2017" )
DateTime date_obj = DateTime.ParseExact(old_date, "MM/dd/yyyy", null);  // Конвертируем строку с датой в объект DateTime.
DateTime new_date = date_obj.AddDays(int.Parse(project.Variables["переменная"].Value));  // Прибавляем/отнимаем дни из переменной.
return new_date.ToString(@"MM\/dd\/yyyy");  // Возвращаем дату в формате - "месяц/день/год" ("07/03/2017" )
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 069
Благодарностей
2 818
Баллы
113
Скажите а как отнять рандомно, например от 5 до 15 дней?
C#:
string old_date = project.Variables["old_date"].Value;
DateTime date_obj = DateTime.ParseExact(old_date, "MM/dd/yyyy", null);
int r = new Random().Next(5, 16);
DateTime new_date = date_obj.AddDays(-r);
return new_date.ToString(@"MM\/dd\/yyyy");
 
  • Спасибо
Реакции: kagorec и xopek2007

xopek2007

Client
Регистрация
10.05.2013
Сообщения
73
Благодарностей
4
Баллы
8
Вот это спасибище!
 

xopek2007

Client
Регистрация
10.05.2013
Сообщения
73
Благодарностей
4
Баллы
8
У меня образовалась проблемка. Дата парсится в формате 1/27/2017 и 01/27/2017 . В первом случае, код выше, выдает ошибку. Не подскажете как решить?
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 069
Благодарностей
2 818
Баллы
113
У меня образовалась проблемка. Дата парсится в формате 1/27/2017 и 01/27/2017 . В первом случае, код выше, выдает ошибку. Не подскажете как решить?
C#:
string old_date = project.Variables["old_date"].Value;
DateTime date_obj = DateTime.ParseExact(old_date.PadLeft(10, '0'), "MM/dd/yyyy", null);
DateTime new_date = date_obj.AddDays(5);
return new_date.ToString(@"MM/dd/yyyy");
 
  • Спасибо
Реакции: xopek2007

xopek2007

Client
Регистрация
10.05.2013
Сообщения
73
Благодарностей
4
Баллы
8
Спасибо большое!:-) Не сочтите за наглость, а возможно на выходе получить 01/27/2017 вместо 01.27.2017?
Код работает! Но... Если просто установить значение переменной то все Ок, если спарсить то необходимо выполнить Trim. Хотя, возможно это только в моем случае.
Да, если не возможно вывести дату со слешами, то можно просто заменить точки в обработке текста
 
Последнее редактирование:

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 176
Благодарностей
446
Баллы
83
Подозреваю, что как-то так:
C#:
return new_date.ToString("dd'/'MM'/'yyyy");
Простите, что вмешался :-)
 
  • Спасибо
Реакции: xopek2007

xopek2007

Client
Регистрация
10.05.2013
Сообщения
73
Благодарностей
4
Баллы
8
Вот так работает! Спасибо!!!
C#:
string old_date = project.Variables["old_date"].Value;
DateTime date_obj = DateTime.ParseExact(old_date.PadLeft(10, '0'), "MM/dd/yyyy", null);
DateTime new_date = date_obj.AddDays(1);
return new_date.ToString(@"MM\/dd\/yyyy");
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 069
Благодарностей
2 818
Баллы
113
Ничего не понял :-) А в чём разница этих трёх строк?
Код:
"MM/dd/yyyy"
@"MM/dd/yyyy"
@"MM\/dd\/yyyy"
 

xopek2007

Client
Регистрация
10.05.2013
Сообщения
73
Благодарностей
4
Баллы
8
К сожалению я не знаю, случайно вышло :(, строка @"MM/dd/yyyy вернула дату в формате 01.01.2001 а строка @"MM\/dd\/yyyy - 01/01/2001. Магия:-).
Тут microsoft приводит примеры, но нет разъяснения что по чем, возможно это региональные стандарты какие?
 

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
274
Баллы
63
К сожалению я не знаю, случайно вышло :(, строка @"MM/dd/yyyy вернула дату в формате 01.01.2001 а строка @"MM\/dd\/yyyy - 01/01/2001. Магия:-).
Тут microsoft приводит примеры, но нет разъяснения что по чем, возможно это региональные стандарты какие?
Одинарный символ "/" трактуется как разделитель компонентов даты, который устанавливается исходя из текущей локали. В данном случае это просто точка. Его также можно задать через свойство
DateTimeFormatInfo.DateSeparator.

Код:
var dtFormatInfo = new DateTimeFormatInfo {DateSeparator = "[my separator]"};
Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy", dtFormatInfo)); //выведет 25[my separator]12[my separator]2017
В этом же случае
вы экранируете символ "/" и поэтому он воспринимается не как специальный разделитель, а как простой символ.
 
  • Спасибо
Реакции: xopek2007

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 176
Благодарностей
446
Баллы
83
Только что работал с датами в своём шаблоне.
Всё прекрасно работает как в примере Dimionix
указываем @ перед строковым литералом и можно любой разделитель писать.
 

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
258
Благодарностей
27
Баллы
28
Подскажите как в этом коде

Код:
string old_date = project.Variables["old_date"].Value; // в Зенке в переменой "old_date" должна быть наша старая дата "месяц/день/год" ("17.01.2019" )
DateTime date_obj = DateTime.ParseExact(old_date, @"dd/MM/yyyy", null);  // Конвертируем строку с датой в объект DateTime.
DateTime new_date = date_obj.AddDays(5);  // Прибавляем к дате 5 дней.
return new_date.ToString(@"dd/MM/yyyy");  // Возвращаем дату в формате - "месяц/день/год" ("22.01.2019" )
Прибавить к дате не 5 дней, а переменную "days" где и будет число...?
 

ibred

Administrator
Команда форума
Регистрация
04.04.2015
Сообщения
3 494
Благодарностей
2 915
Баллы
113
Подскажите как в этом коде прибавить к дате не 5 дней, а переменную "days" где и будет число...?
Заменить:
C#:
DateTime new_date = date_obj.AddDays(5)
На:
C#:
DateTime new_date = date_obj.AddDays(Convert.ToInt32(project.Variables["days"].Value))
 
  • Спасибо
Реакции: ukrainec2014

ukrainec2014

Client
Регистрация
12.05.2017
Сообщения
258
Благодарностей
27
Баллы
28
Ну и еще одно, как отнимать от даты в переменной дату с другой переменной и получать число ..?
 

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