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

  • Автор темы Автор темы backoff
  • Дата начала Дата начала

backoff

Client
Регистрация
20.04.2015
Сообщения
6 355
Реакции
6 640
Баллы
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
 
Номер конкурса статей
  1. Двадцатый конкурс статей
Тема статьи
  1. Другое

Вложения

  • Спасибо
Реакции: backoff
  • Спасибо
Реакции: backoff
Возможно ли адаптировать сниппет, чтобы не было нулевых значений времени, например:

Сейчас:
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);
 
Прибавляйте нужное количество часов к исходному
C#:
Развернуть Свернуть Копировать
// Исходное время
DateTime dtf = DateTime.UtcNow;
// Добавляем 1 час
DateTime dt2 = dtf.AddHours(1);

или выводите в лог только нужное
 
Прибавляйте нужное количество часов к исходному
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#, которого нет.
 
Хотелось бы скорректировать именно данный код:
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
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. Входная строка имела неверный формат.
 
int x = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
Попробуйте добавить
using System.Text;

using System.Text; - добавлен, "int x" добавил - не работает:
Выполнение действия CSharp OwnCode. Входная строка имела неверный формат.
 
  • Спасибо
Реакции: backoff и material
в переменной 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

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