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

  • Автор темы Автор темы semafor
  • Дата начала Дата начала
Всем привет. Спасибо огромное за эту тему. Я хоть и новичок, но уже много чего для себя взял))
Подскажите, пожалуйста, есть задача, которую своими усилиями не решить:
Есть 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
итд

Как сравнить мою дату из переменной, с датами в списке и взять нужное значение? Помогите, пожалуйста.)
 
Всем привет. Спасибо огромное за эту тему. Я хоть и новичок, но уже много чего для себя взял))
Подскажите, пожалуйста, есть задача, которую своими усилиями не решить:
Есть 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
итд

Как сравнить мою дату из переменной, с датами в списке и взять нужное значение? Помогите, пожалуйста.)
А даты повторяются в списке?
 
Нет, даты не повторяются. Да и список этот константа по большому счету. Это даты, с которых ЦБ установил ставку.
Тогда можно завести 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;
 
Тогда можно завести 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.
 
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];

Может кому то нужно будет
 

Вложения

  • list.txt
    list.txt
    757 байт · Просмотры: 195
  • Спасибо
Реакции: zennomag
Здравствуйте! Подскажите новичку кто нибудь не могу додуматься как проставить дату рождения в таком формате (__. __.____.) Как я понял это — диапазон от 01 до 31 (dd.MM.yyyy - 01.01.2020)
 
Мне нужно запускать проект раз в сутки. (записываю в таблицу дату и время). Интервал запуска не имеет значения. Главное что бы я понимал, что задача была выполнена вчера, а не сегодня и я мог запустить ее. Можно конечно регуляркой дату сравнивать. Но может есть более интересное решение?
 
я даты превращал в цифры и сравнивал 29.04 в 2904 это прошлое время, настоящее 3004 настоящее
А если 3004 и 0105? Логику не улавливаю)
Да тут кодом смысла нету судя по всему. Спарсить день и IF сравнить. Совпало, значит проект запущен был сегодня. Если не совпало, то не был запущен.
 
Мне нужно запускать проект раз в сутки. (записываю в таблицу дату и время). Интервал запуска не имеет значения. Главное что бы я понимал, что задача была выполнена вчера, а не сегодня и я мог запустить ее. Можно конечно регуляркой дату сравнивать. Но может есть более интересное решение?
Привет. Примерно так:
C#:
Развернуть Свернуть Копировать
long yesterdayTimeStamp = 1651190340; // зарезервированный Time Stamp последнего запуска
bool wasTaskCompletedYesterdayOrEarlier = (yesterdayTimeStamp < DateTimeOffset.Now.AddDays(-1).ToUnixTimeSeconds());
 
  • Спасибо
Реакции: art22 и Mikhail B.
Подскажите как с помощью c# сделать вывод даты из переменных профиля в формате 01/01/1990 ?

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

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

По умолчанию вывод в формате 1/1/1990
 
Подскажите как с помощью 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
Подскажите как с помощью 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: Исправил первый пример. В коде была косая кавычка.

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

Вложения

Последнее редактирование:
есть даты в подобном формате: 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. Как это исправить?
 
есть даты в подобном формате: 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
 
ну я предполагал, что это связано с часовыми поясами, но вопрос тот же - как это обойти.
Это не помогает?
C#:
Развернуть Свернуть Копировать
project.Variables["output"].Value = d.ToUniversalTime().ToString("dd-MM-yyyy");

У меня на тестовом сервере сразу 10 число было, поэтому наверняка сказать не могу.
 
  • Спасибо
Реакции: bad robot
Миллион проблем с этим временем... Я сделал всё проще. В гугл таблице сделал ячейки с функцией СЕГОДНЯ() в нужном мне формате. Там в формуле сразу можно и добавить и убавить дату на сколько нужно. Например, =СЕГОДНЯ()-2

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

// время, которое необходимо получить в 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 из переменной. не пойму, подскажите пожалуйста, так то оно работает, а засунуть как, и что бы на три часа больше в секундах не получалось.
 
Здравствуйте

// время, которое необходимо получить в 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;
 
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
 
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); сюда как подставить нужное время.
 
Спасибо большое, но мне не текущее время надо а завтра в 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

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