Работа с датой и временем в Zennoposter с использованием методов C#

zennomag

Client
Регистрация
03.09.2022
Сообщения
9
Благодарностей
0
Баллы
1
Всем привет. Спасибо огромное за эту тему. Я хоть и новичок, но уже много чего для себя взял))
Подскажите, пожалуйста, есть задача, которую своими усилиями не решить:
Есть exel файл, либо могу список сделать, без разницы, следующего вида:

19.09.20227,5
25.07.20228
14.06.20229,5
27.05.202211
04.05.202214
11.04.202217
28.02.202220
14.02.20229,5
20.12.20218,5
25.10.20217,5
13.09.20216,75
26.07.20216,5
15.06.20215,5
26.04.20215
22.03.20214,5
27.07.20204,25
22.06.20204,5
27.04.20205,5
10.02.20206
16.12.20196,25
28.10.20196,5
09.09.20197
29.07.20197,25
17.06.20197,5
17.12.20187,75
17.09.20187,5
26.03.20187,25
12.02.20187,5
18.12.20177,75
30.10.20178,25
18.09.20178,5
19.06.20179
02.05.20179,25
27.03.20179,75
19.09.201610
14.06.201610,5
03.08.201511
16.06.201511,5
05.05.201512,5
16.03.201514
02.02.201515
16.12.201417
12.12.201410,5
05.11.20149,5
28.07.20148
28.04.20147,5
03.03.20147
13.09.20135,5

У меня в переменной лежит дата. Эту дату я должен сравнить с датами в таблице и взять значение. Есть нюанс.
В период с 13.09.2013 по 03.03.2014 - значение 5,5
В период с 03.03.2014 по 28.04.2014 - значение 7
В период с 28.04.2014 по 28.07.2014 - значение 7,5
итд

Как сравнить мою дату из переменной, с датами в списке и взять нужное значение? Помогите, пожалуйста.)
 

viol2021

Client
Регистрация
12.01.2021
Сообщения
481
Благодарностей
179
Баллы
43
Всем привет. Спасибо огромное за эту тему. Я хоть и новичок, но уже много чего для себя взял))
Подскажите, пожалуйста, есть задача, которую своими усилиями не решить:
Есть exel файл, либо могу список сделать, без разницы, следующего вида:

19.09.20227,5
25.07.20228
14.06.20229,5
27.05.202211
04.05.202214
11.04.202217
28.02.202220
14.02.20229,5
20.12.20218,5
25.10.20217,5
13.09.20216,75
26.07.20216,5
15.06.20215,5
26.04.20215
22.03.20214,5
27.07.20204,25
22.06.20204,5
27.04.20205,5
10.02.20206
16.12.20196,25
28.10.20196,5
09.09.20197
29.07.20197,25
17.06.20197,5
17.12.20187,75
17.09.20187,5
26.03.20187,25
12.02.20187,5
18.12.20177,75
30.10.20178,25
18.09.20178,5
19.06.20179
02.05.20179,25
27.03.20179,75
19.09.201610
14.06.201610,5
03.08.201511
16.06.201511,5
05.05.201512,5
16.03.201514
02.02.201515
16.12.201417
12.12.201410,5
05.11.20149,5
28.07.20148
28.04.20147,5
03.03.20147
13.09.20135,5

У меня в переменной лежит дата. Эту дату я должен сравнить с датами в таблице и взять значение. Есть нюанс.
В период с 13.09.2013 по 03.03.2014 - значение 5,5
В период с 03.03.2014 по 28.04.2014 - значение 7
В период с 28.04.2014 по 28.07.2014 - значение 7,5
итд

Как сравнить мою дату из переменной, с датами в списке и взять нужное значение? Помогите, пожалуйста.)
А даты повторяются в списке?
 

zennomag

Client
Регистрация
03.09.2022
Сообщения
9
Благодарностей
0
Баллы
1

viol2021

Client
Регистрация
12.01.2021
Сообщения
481
Благодарностей
179
Баллы
43
Нет, даты не повторяются. Да и список этот константа по большому счету. Это даты, с которых ЦБ установил ставку.
Тогда можно завести dictionary где ключем будут даты и дергать от туда.
Примерно так

C#:
Dictionary<string, double> dic = new Dictionary<string, double>();
dic.Add("19.09.2022",7.5);

string test = "19.09.2022";

if(dic[test] == 7.5)
    return 7.5;
 

zennomag

Client
Регистрация
03.09.2022
Сообщения
9
Благодарностей
0
Баллы
1
Тогда можно завести dictionary где ключем будут даты и дергать от туда.
Примерно так

C#:
Dictionary<string, double> dic = new Dictionary<string, double>();
dic.Add("19.09.2022",7.5);

string test = "19.09.2022";

if(dic[test] == 7.5)
    return 7.5;
Да, все так, но есть одно но))
19.09.2022 по сегодняшний день 7.5
идем вниз
с 19.09.2022 по 25.07.2022 - 8
с 25.07.2022 по 14.06.2022 - 9,5
итд...
Т.е моя дата, (например 21.08.2022) которую я сравниваю, должна попасть в период между этими датами и взять нужное значение.
21.08.2022 - попали в период с 25.07.2022 по 19.09.2022 - значение 8.
 

viol2021

Client
Регистрация
12.01.2021
Сообщения
481
Благодарностей
179
Баллы
43
C#:
var list = project.Lists["list"];
Dictionary<long, double> dic = new Dictionary<long, double>();

DateTime dt = DateTime.Parse("21.08.2022");
long tc = dt.Ticks;
long c = 0;

foreach(var l in list)
{
    DateTime t = DateTime.Parse(l.Split(':')[0]);
    dic.Add(t.Ticks, Double.Parse(l.Split(':')[1]));
}

Dictionary<long,double> newDic = dic.OrderBy(r=> r.Key).ToDictionary(r=> r.Key, r=> r.Value);
foreach(var k in newDic.Keys)
{
    if(k > tc)break;
    else c = k;
}

return dic[c];
Может кому то нужно будет
 

Вложения

  • 757 байт Просмотры: 65
  • Спасибо
Реакции: zennomag

1983anton

Client
Регистрация
19.12.2022
Сообщения
49
Благодарностей
4
Баллы
8
Здравствуйте! Подскажите новичку кто нибудь не могу додуматься как проставить дату рождения в таком формате (__. __.____.) Как я понял это — диапазон от 01 до 31 (dd.MM.yyyy - 01.01.2020)
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
Мне нужно запускать проект раз в сутки. (записываю в таблицу дату и время). Интервал запуска не имеет значения. Главное что бы я понимал, что задача была выполнена вчера, а не сегодня и я мог запустить ее. Можно конечно регуляркой дату сравнивать. Но может есть более интересное решение?
 

art22

Client
Регистрация
24.06.2016
Сообщения
484
Благодарностей
68
Баллы
28

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
я даты превращал в цифры и сравнивал 29.04 в 2904 это прошлое время, настоящее 3004 настоящее
А если 3004 и 0105? Логику не улавливаю)
Да тут кодом смысла нету судя по всему. Спарсить день и IF сравнить. Совпало, значит проект запущен был сегодня. Если не совпало, то не был запущен.
 

art22

Client
Регистрация
24.06.2016
Сообщения
484
Благодарностей
68
Баллы
28
  • Спасибо
Реакции: Mikhail B.

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 050
Баллы
93
Мне нужно запускать проект раз в сутки. (записываю в таблицу дату и время). Интервал запуска не имеет значения. Главное что бы я понимал, что задача была выполнена вчера, а не сегодня и я мог запустить ее. Можно конечно регуляркой дату сравнивать. Но может есть более интересное решение?
Привет. Примерно так:
C#:
long yesterdayTimeStamp = 1651190340; // зарезервированный Time Stamp последнего запуска
bool wasTaskCompletedYesterdayOrEarlier = (yesterdayTimeStamp < DateTimeOffset.Now.AddDays(-1).ToUnixTimeSeconds());
 
  • Спасибо
Реакции: art22 и Mikhail B.

FreddyKrueger

Client
Регистрация
06.09.2016
Сообщения
626
Благодарностей
397
Баллы
63
Подскажите как с помощью c# сделать вывод даты из переменных профиля в формате 01/01/1990 ?

{-Profile.BornMonth-}/{-Profile.BornDay-}/{-Profile.BornYear-}

Чтобы был ноль в начале дня или месяца.

По умолчанию вывод в формате 1/1/1990
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 758
Благодарностей
2 392
Баллы
113
Подскажите как с помощью c# сделать вывод даты из переменных профиля в формате 01/01/1990 ?

{-Profile.BornMonth-}/{-Profile.BornDay-}/{-Profile.BornYear-}

Чтобы был ноль в начале дня или месяца.

По умолчанию вывод в формате 1/1/1990
На сколько я понял, нужно преобразовать в строку и дополнить нужным количеством нулей слева.
Вот пример:
C#:
return string.Join("/",    new[]{
        project.Profile.BornMonth.ToString().PadLeft(2,'0'),// Месяц
        project.Profile.BornDay.ToString().PadLeft(2,'0'),    // День
        project.Profile.BornYear.ToString().PadLeft(4,'0')    // Год
    });
108905
 
  • Спасибо
Реакции: one и FreddyKrueger

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 050
Баллы
93
Подскажите как с помощью c# сделать вывод даты из переменных профиля в формате 01/01/1990 ?

{-Profile.BornMonth-}/{-Profile.BornDay-}/{-Profile.BornYear-}

Чтобы был ноль в начале дня или месяца.

По умолчанию вывод в формате 1/1/1990
Привет. :bt:
Возможно мой вариант вам тоже может быть полезен.
Вместо данных из профиля можно использовать свою строку с датой и свой формат парсинга.

Решение:
Парсинг и конвертация даты в удобный формат:
string inputStringDate = string.Join("/", project.Profile.BornMonth, project.Profile.BornDay, project.Profile.BornYear);
if (!DateTime.TryParseExact(inputStringDate, new []{ "M/d/yyyy" }, CultureInfo.InvariantCulture, DateTimeStyles.None,
        out DateTime date)) throw new FormatException($"Неверный формат даты :: {inputStringDate}");
project.SendInfoToLog(date.ToString(@"MM\/dd\/yyyy")); // вывод в лог
Пример использования:
Пример различных форматов:
string inputStringDate = string.Join("/", project.Profile.BornMonth, project.Profile.BornDay, project.Profile.BornYear);
if (!DateTime.TryParseExact(inputStringDate, new []{ "M/d/yyyy", "MM/dd/yyyy" }, CultureInfo.InvariantCulture, DateTimeStyles.None,
        out DateTime date)) throw new FormatException($"Неверный формат даты :: {inputStringDate}");

/* Примеры вывода в разном формате */
project.SendInfoToLog(date.ToString(@"dd\/MM\/yyyy"));
project.SendInfoToLog(date.ToString("dd.MM.yyyy"));
project.SendInfoToLog(date.ToString(@"MM\/dd\/yyyy"));
project.SendInfoToLog(date.ToString("MM.dd.yyyy"));
project.SendInfoToLog(date.ToString("dd,MMM,yy"));
project.SendInfoToLog(date.ToString("yyyy,dd,MM"));
project.SendInfoToLog(date.ToString("MM-dd-yyyy"));
project.SendInfoToLog(date.ToString("MM-dd"));
/* и другие варианты */
Результат:
109029


Не забудьте подключить using в “Директивы using и общий код” → вторая вкладка.
Using:
using System.Globalization;
upd: Исправил первый пример. В коде была косая кавычка.

Приложил шаблон ↓
 

Вложения

Последнее редактирование:

bad robot

Client
Регистрация
07.03.2011
Сообщения
174
Благодарностей
26
Баллы
28
есть даты в подобном формате: Sun Sep 10 21:13:31 +0000 2023

конвертирую таким кодом:
C#:
DateTime d = DateTime.ParseExact(project.Variables["input"].Value, "ddd MMM dd HH:mm:ss zzzz yyyy", System.Globalization.CultureInfo.InvariantCulture);
project.Variables["output"].Value = d.ToString("dd-MM-yyyy");
в большинстве случаев все как надо, но из вышеприведенной даты он почему-то делает 11-09-2023. Как это исправить?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 595
Баллы
113
есть даты в подобном формате: Sun Sep 10 21:13:31 +0000 2023

конвертирую таким кодом:
C#:
DateTime d = DateTime.ParseExact(project.Variables["input"].Value, "ddd MMM dd HH:mm:ss zzzz yyyy", System.Globalization.CultureInfo.InvariantCulture);
project.Variables["output"].Value = d.ToString("dd-MM-yyyy");
в большинстве случаев все как надо, но из вышеприведенной даты он почему-то делает 11-09-2023. Как это исправить?
потому что там часовой пояс +0, а тубя минимум +3
 

bad robot

Client
Регистрация
07.03.2011
Сообщения
174
Благодарностей
26
Баллы
28

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 108
Благодарностей
470
Баллы
83
ну я предполагал, что это связано с часовыми поясами, но вопрос тот же - как это обойти.
Это не помогает?
C#:
project.Variables["output"].Value = d.ToUniversalTime().ToString("dd-MM-yyyy");
У меня на тестовом сервере сразу 10 число было, поэтому наверняка сказать не могу.
 
  • Спасибо
Реакции: bad robot

Nekro

Client
Регистрация
01.08.2020
Сообщения
223
Благодарностей
22
Баллы
18
Миллион проблем с этим временем... Я сделал всё проще. В гугл таблице сделал ячейки с функцией СЕГОДНЯ() в нужном мне формате. Там в формуле сразу можно и добавить и убавить дату на сколько нужно. Например, =СЕГОДНЯ()-2

И никаких больше проблем. Мне идеально подошло такое решение, чем возиться с этими форматами на C#. Может кому-то это сэкономит тонну времени, как мне.
 

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