Работа с датой и временем в 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
Сообщения
482
Благодарностей
180
Баллы
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
Сообщения
482
Благодарностей
180
Баллы
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
Сообщения
482
Благодарностей
180
Баллы
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 байт Просмотры: 109
  • Спасибо
Реакции: zennomag

1983anton

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

Mikhail B.

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

art22

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

Mikhail B.

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

art22

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

djaga

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

FreddyKrueger

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

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

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

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 794
Благодарностей
2 466
Баллы
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

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
554
Благодарностей
1 136
Баллы
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
Сообщения
208
Благодарностей
55
Баллы
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 685
Благодарностей
4 642
Баллы
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
Сообщения
208
Благодарностей
55
Баллы
28

n0n3mi1y

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

Nekro

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

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

mihanat

Client
Регистрация
26.02.2017
Сообщения
38
Благодарностей
18
Баллы
8
Здравствуйте

// время, которое необходимо получить в UnixTime
DateTime time = new DateTime(2020,2,19,20,34,0,DateTimeKind.Utc);

// установка времени
DateTime dateTime = new DateTime(1970, 1, 1,0,0,0,DateTimeKind.Utc);

// время в UnixTime
long dts = (time - dateTime).TotalSeconds;
а как туда засунуть время, которое необходимо получить в UnixTime из переменной. не пойму, подскажите пожалуйста, так то оно работает, а засунуть как, и что бы на три часа больше в секундах не получалось.
 

MaximTurbo

Client
Регистрация
11.10.2019
Сообщения
49
Благодарностей
12
Баллы
8
Здравствуйте

// время, которое необходимо получить в UnixTime
DateTime time = new DateTime(2020,2,19,20,34,0,DateTimeKind.Utc);

// установка времени
DateTime dateTime = new DateTime(1970, 1, 1,0,0,0,DateTimeKind.Utc);

// время в UnixTime
long dts = (time - dateTime).TotalSeconds;
а как туда засунуть время, которое необходимо получить в UnixTime из переменной. не пойму, подскажите пожалуйста, так то оно работает, а засунуть как, и что бы на три часа больше в секундах не получалось.
DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);// Unixtime
DateTime currentTime = DateTime.Now; // Текущее время
DateTime adjustedTime = currentTime.AddHours(-3); //Отнимаем 3 часа
long unixTimeMilliseconds = (long)(adjustedTime - unixEpoch).TotalMilliseconds; //конвертируем в unixtime
return unixTimeMilliseconds;
 

mihanat

Client
Регистрация
26.02.2017
Сообщения
38
Благодарностей
18
Баллы
8
DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);// Unixtime
DateTime currentTime = DateTime.Now; // Текущее время
DateTime adjustedTime = currentTime.AddHours(-3); //Отнимаем 3 часа
long unixTimeMilliseconds = (long)(adjustedTime - unixEpoch).TotalMilliseconds; //конвертируем в unixtime
return unixTimeMilliseconds;
[/QUOTE
 

mihanat

Client
Регистрация
26.02.2017
Сообщения
38
Благодарностей
18
Баллы
8
DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);// Unixtime
DateTime currentTime = DateTime.Now; // Текущее время
DateTime adjustedTime = currentTime.AddHours(-3); //Отнимаем 3 часа
long unixTimeMilliseconds = (long)(adjustedTime - unixEpoch).TotalMilliseconds; //конвертируем в unixtime
return unixTimeMilliseconds;
Спасибо большое, но мне не текущее время надо а завтра в 7.55 например, и как это вставить в код из переменной проекта, вообще не пойму, DateTime time = new DateTime(2020,2,19,20,34,0,DateTimeKind.Utc); сюда как подставить нужное время.
 

MaximTurbo

Client
Регистрация
11.10.2019
Сообщения
49
Благодарностей
12
Баллы
8
Спасибо большое, но мне не текущее время надо а завтра в 7.55 например, и как это вставить в код из переменной проекта, вообще не пойму, DateTime time = new DateTime(2020,2,19,20,34,0,DateTimeKind.Utc); сюда как подставить нужное время.
в кубике c# наведи мышку на "new DateTime" в переменной DateTime time = new DateTime(2020,2,19,20,34,0,DateTimeKind.Utc); и увидишь подсказку
124313
 
  • Спасибо
Реакции: mihanat

mihanat

Client
Регистрация
26.02.2017
Сообщения
38
Благодарностей
18
Баллы
8

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 285
Благодарностей
625
Баллы
113

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