Периодически поступают вопросы о том, как можно получить текущую дату или время из скрипта в Adrenaline боте.
Стандартный модуль SysUtlis, доступный в боте, содержит в себе все необходимое, в частности доступен тип данных TDateTime.
Сразу отмечу, что модуль DateUtils в боте не доступен, поэтому в при выполнении некоторых операций придется немного изворачиваться.
Разберем основные операции.
1. Получение текущих даты\времени:
В скрипт движке бота доступны стандартные функции языка Date, Time, Now, возвращающие соответствующие значения типа даты\времени.
2. Конвертировать дату\время в строку и обратно:
Для конвертации даты\времени в строку есть методы: DateTimeToStr, DateToStr, TimeToStr, FormatDateTime (читайте внимательно описание этой функции, там есть описание доступных форматов вывода)
Для конвертации строки в дату\время пристуствуют: StrToDateTime, StrToDate, StrToTime.
Важный момент: формат даты\времени может отличаться в зависимости от локали пользователя, т.е. в России это dd.mm.yyyy, а у многих зарубежных стран dd/mm/yyyy.
Рассмотрим несколько примеров:
uses SysUtils;
begin
Print(DateToStr(Date)); // распечатает текущую дату (01.10.2018)
Print(TimeToStr(Time)); // распечатает текущее время (0:49:44)
Print(DateTimeToStr(Now)); // распечатает текущие дату и время (01.10.2018 0:49:44)
Print(FormatDateTime('hh:nn:ss.zzz', Time)); // распечатает текущее время в формате: 00:49:44.579
Print(FormatDateTime('dd mmmm yyyy hh:nn:ss.zzz', Now)); // распечатает текущее время в формате: 01 Октябрь 2018 00:49:44.579
Print(StrToDateTime('01.10.2018 2:07:31'));
Print(DateTimeToStr(StrToDateTime('00:49:44'))); // приводим строку к типу TDateTime, а потом обратно к строке, и распечатываем
end.
3. Типовые операции с датой\временем:
Переменные типа TDateTime можно сравнивать друг с другом а так же складывать\вычитать:
uses SysUtils;
var
past, future, delta: TDateTime;
begin
past:= Now; // запоминаем время 1ый раз
Delay(1000); // ждем 1 секунду
future:= Now; // запоминаем время 2ой раз
// теперь у нас есть 2 переменные, с разницой в 1 секунду, и мы можем делать с ними что-нибудь
if (future > past) then ... // сравниваем их значения (в данном случае условие вернет true)
delta:= future - past; // запоминаем разницу между двумя моментами времени
Print(TimeToStr(delta)); // печатаем эту разницу (0:00:01)
end.
Как это все можно применять на практике?
Представим, что между двумя какими-то ключевыми действиями должно пройти минимум 10 минут. А еще между этими действиями мы должны пробежать из точки А в точку Б, причем время, потраченное на маршрут - заранее точно не известно (около 3-7 минут). Мы хотим сделать умную проверку, чтобы наш бот не пытался делать второе действие, пока не пройдет 10 минут с моментами совершения 1го.
uses SysUtils;
var
Timer: TDateTime;
begin
// совершаем 1ое действие
Timer:= Now + StrToDateTime('00:10:00'); // прибавляем к текущему времени 10 минут и запоминаем этот момент времени
// Engine.MoveTo(...);
// Engine.MoveTo(...);
// Engine.MoveTo(...);
while (Now < Timer) do Delay(500); // ждем пока не пройдет 10 минут с момента совершения 1го действия
// совершаем 2ое действие
end.
Примитивный пример ограничения работы скрипта по времени. Данная проверка очень не надежна, т.к. проверяет время ПК пользователя, а он может его менять. Если Вы занимаетесь разработкой скриптов, и хотите внедрить систему лицензирования по ключам, Вам сюда: Verify.su (скриптерам под Adrenaline доступны существенные скидки).
uses SysUtils;
begin
if (Now > StrToDateTime('30.09.2018')) then begin
Print('Время работы скрипта истекло!');
Script.Stop;
end;
// code ...
end.
Кроме того, в движке бота доступна функция function GetTickCount: Cardinal;
- возвращает кол-во милисекунд, прошедшее с моментами запуска системы.
Ее так же можно использовать в качестве таймеров или, например, чтобы засечь время выполнения какого-то участка кода.
uses SysUtils;
var
T: Cardinal;
begin
T:= GetTickCount(); // запоминаем момент времени
// code ...
Print(GetTickCount() - T); // печатаем кол-во затраченных мс на выполнение участка кода
T:= GetTickCount(); // запоминаем момент времени
while (GetTickCount() < T+10*60*1000) do Delay(500); // ждем пока не пройдет 10 минут
end.