Работа со временем: преобразование и логика

backoff

Client
Регистрация
20.04.2015
Сообщения
5 926
Благодарностей
6 389
Баллы
113
Привет, тут максимально просто и подробно постараюсь описать, как работать со временем и зачем это надо. Это только личный опыт и личное мнение.

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

Теперь к практике и применению.
Я для себя в то время, когда столкнулся с этой проблемой, решил, что время стоит использовать для работы только в UnixTime формате (секунды) самый точный вариант как по мне.

взять время в UnixTime в данный момент - основной сниппет
C#:
int unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
return unixTime;
В переменной будет примерно такое - 1701861814 - это время в секундах на данный момент
Все. теперь от этого времени можно плясать в любые стороны.

Например нам надо проверит прошли ли сутки, при взятии аккаунта.
Логика такая:
1. В конце работы шаблона, перед записью в таблицу, берем этим снипом время и записываем в БД
2. В начале работы с аккаунтом берем строку из БД и проверяем переменную со временем
А как это сделать? Просто!
в сутках 24 часа, в 1 часе 60 мин, в 1 мин 60 сек

60*60 = 3600 сек в 1 часе
36000*24 = 86400 сек в 1 сутках

Соответственно берем переменную время конца работы и проверяем в кубике IF
Надо взять время (timeStart), которое сейчас (в момент проверки), взять время (timeEnd) окончания шаблона вычесть одно из другого и проверить
выглядит это так

115181


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

Еще пример.
Например нам надо знать сколько времени занимает работа шаблона, чтобы примерно представлять среднее время. Чтоб в будущем оптимизировать/останавливать шаблон.
Можно оставить простую математику t1 - t2 получаем сколько работал шаблон в секундах, но можно сделать более человеческий вид.

Нам поможет сниппет
C#:
int x = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
int y = int.Parse(project.Variables["timeStart"].Value);
var ts = TimeSpan.FromSeconds(x - y);
return string.Format("{0} д. {1} ч. {2} мин. {3} сек.", ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
где timeStart - это время начала работы шаблона

выглядит это так
115182



Так же часто встречаю такие темы как: Как вычесть неделю от даты, Как добавить час времени, Как прибавить10 дней.
С unixTime это лишь простейшая математика, которую может сделать каждый, пользуйтесь.
А так же на форуме собрано огромное количество сниппетов для возможности переконвертировать любую дату в unixTime.

Казалось бы, такая мелочь и простота, но иногда не хватает всего лишь одной части пазла, чтоб собрать огромную картину.

Я лично перестал пользоваться чем либо, кроме как UnixTime, чего и вам советую.



115185
 
Тема статьи
Другое
Номер конкурса статей
Двадцатый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

radv

Client
Регистрация
11.05.2015
Сообщения
3 682
Благодарностей
1 866
Баллы
113
  • Спасибо
Реакции: backoff

smartmail

Client
Регистрация
18.04.2015
Сообщения
371
Благодарностей
193
Баллы
43
  • Спасибо
Реакции: backoff

material

Client
Регистрация
23.03.2021
Сообщения
243
Благодарностей
76
Баллы
28
Возможно ли адаптировать сниппет, чтобы не было нулевых значений времени, например:

Сейчас:
0 д. 0 ч. 25 мин. 10 сек.
0 д. 2 ч. 25 мин. 10 сек.

После изменений C#:
25 мин. 10 сек.
2 ч. 25 мин. 10 сек.

Продублирую сам сниппет из первого поста:

C#:
int x = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
int y = int.Parse(project.Variables["timeStart"].Value);
var ts = TimeSpan.FromSeconds(x - y);
return string.Format("{0} д. {1} ч. {2} мин. {3} сек.", ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 682
Благодарностей
1 866
Баллы
113
Прибавляйте нужное количество часов к исходному
C#:
// Исходное время
DateTime dtf = DateTime.UtcNow;
// Добавляем 1 час
DateTime dt2 = dtf.AddHours(1);
или выводите в лог только нужное
 

material

Client
Регистрация
23.03.2021
Сообщения
243
Благодарностей
76
Баллы
28
Прибавляйте нужное количество часов к исходному
C#:
// Исходное время
DateTime dtf = DateTime.UtcNow;
// Добавляем 1 час
DateTime dt2 = dtf.AddHours(1);
или выводите в лог только нужное
Хотелось бы скорректировать именно данный код:

C#:
int x = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
int y = int.Parse(project.Variables["timeStart"].Value);
var ts = TimeSpan.FromSeconds(x - y);
return string.Format("{0} д. {1} ч. {2} мин. {3} сек.", ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
Для всего остального требуется базовый уровень владения C#, которого нет.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 682
Благодарностей
1 866
Баллы
113
Хотелось бы скорректировать именно данный код:
C#:
int y = int.Parse(project.Variables["timeStart"].Value);

var ts = TimeSpan.FromSeconds(x - y);

System.Text.StringBuilder sb = new System.Text.StringBuilder();

if(ts.Days > 0)
{
    sb.Append($"{ts.Days} д. ");
}
if (ts.Hours > 0)
{
    sb.Append($"{ts.Hours} ч. ");
}

sb.Append($"{ts.Minutes} мин. {ts.Seconds} сек. {ts.Milliseconds} миллисек.");

return sb.ToString();
 
  • Спасибо
Реакции: material

material

Client
Регистрация
23.03.2021
Сообщения
243
Благодарностей
76
Баллы
28
C#:
int y = int.Parse(project.Variables["timeStart"].Value);

var ts = TimeSpan.FromSeconds(x - y);

System.Text.StringBuilder sb = new System.Text.StringBuilder();

if(ts.Days > 0)
{
    sb.Append($"{ts.Days} д. ");
}
if (ts.Hours > 0)
{
    sb.Append($"{ts.Hours} ч. ");
}

sb.Append($"{ts.Minutes} мин. {ts.Seconds} сек. {ts.Milliseconds} миллисек.");

return sb.ToString();
Не работает к сожалению сначала:
Ошибка в действии "CS0103" "The name 'x' does not exist in the current context". [Строка: 3; Cтолбец: 31]

Потом указал "int x" и стало:
Выполнение действия CSharp OwnCode. Входная строка имела неверный формат.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 682
Благодарностей
1 866
Баллы
113

material

Client
Регистрация
23.03.2021
Сообщения
243
Благодарностей
76
Баллы
28
int x = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
Попробуйте добавить
using System.Text;
using System.Text; - добавлен, "int x" добавил - не работает:
Выполнение действия CSharp OwnCode. Входная строка имела неверный формат.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 682
Благодарностей
1 866
Баллы
113
  • Спасибо
Реакции: backoff и material

material

Client
Регистрация
23.03.2021
Сообщения
243
Благодарностей
76
Баллы
28
в переменной timeStart какое значение указано?
Разобрался, огромное вам спасибо. Прикреплю ваш код к своему посту, что по итогу получилось:
C#:
int x = (int)(DateTime.Now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
int y = int.Parse(project.Variables["time_unix"].Value);

var ts = TimeSpan.FromSeconds(x - y);

System.Text.StringBuilder sb = new System.Text.StringBuilder();

if(ts.Days > 0)
{
    sb.Append($"{ts.Days} д. ");
}
if (ts.Hours > 0)
{
    sb.Append($"{ts.Hours} ч. ");
}
if (ts.Minutes > 0)
{
    sb.Append($"{ts.Minutes} мин. ");
}

sb.Append($"{ts.Seconds} сек.");

return sb.ToString();
 
  • Спасибо
Реакции: radv

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