Zireael |
Отправлено: 08 Июля, 2018 - 23:33:02
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Пример1, Прибавить и отнять 1.5 часа от текущего времени (Отобразить)CODE:int Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds;
// прибавить 1.5 часа к текущему времени
getlocaltime(Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds); // получаем текущее время
time_add(#Hour, #Minute, #Second, 5400); // 5400 секунд это 1.5 часа
messagebox(f(Hour)+":"+f(Minute)+":"+f(Second));
// отнять 1.5 часа от текущего времени
getlocaltime(Year, Month, DayOfWeek, Day, Hour, Minute, Second, Milliseconds);
time_add(#Hour, #Minute, #Second, -5400); // 5400 секунд это 1.5 часа
messagebox(f(Hour)+":"+f(Minute)+":"+f(Second));
// функция принимает указатели на переменные: час, мин, сек и сколько секунд прибавить или отнять
function time_add(int #h, int #m, int #s, int s1)
{
int s2=31536000+h*3600+m*60+s+s1;
h=mod(s2/3600, 24); m=mod((s2-h*3600) / 60, 60); s=mod(s2-(h*3600 + m * 60), 60);
}
function mod(int a, int b){return a-(a/b)*b;} // остаток от деления
function f(int num) // если число однозначное добавляет вначале 0, т. е. 5 станет 05
{
if(size(format(num))<2)return "0"+format(num);
return format(num);
}
Пример2, Сложение/вычитание времени используя таймштамп (Отобразить)CODE:int TimeNow=UnixTime()+108000; // текущее время + 30 часов
int td[6]; // массив, в котором будут храниться: день, месяц, год, час, мин, сек
date(TimeNow, #td[0]); // передаём в функцию время в секундах и указатель на массив
textbkcolor(255, 65280);
messagebox(f(td[0])+"."+f(td[1])+"."+f(td[2])+formatic(13)+formatic(10)+
f(td[3])+":"+f(td[4])+":"+f(td[5]));
function UnixTime() // таймштамп + часовой пояс
{
int a[12], Y, M, W, D, h, m, s, mi; getlocaltime(Y, M, W, D, h, m, s, mi);
a[0]=0;a[1]=31;a[2]=59;a[3]=90;a[4]=120;a[5]=151;a[6]=181;a[7]=212;a[8]=243;a[9]=273;a[10]=304;a[11]=334;
return s+m*60+h*3600+((Y-1970)*365+((Y-1972)/4)+a[M-1]+D)*86400;
}
// преобразует таймштамп в нормальную дату и время
function date(int timestamp, int #m[0])
{
int a[12], year, month, day, hour, min, sec;
a[0]=31;a[1]=28;a[2]=31;a[3]=30;a[4]=31;a[5]=30;
a[6]=31;a[7]=31;a[8]=30;a[9]=31;a[10]=30;a[11]=31;
year=1970 + timestamp / 31557600;
day=mod(timestamp / 86400 - (year-1972) / 4, 365);
for(int i=0; i<11 && day - a[i] > a[i]; i++)day=day-a[i];
m[0]=day-a[i]; m[1]=i+2; m[2]=year; m[3]=mod(timestamp / 3600, 24);
m[4]=mod(timestamp / 60, 60); m[5]=mod(timestamp, 60);
}
function mod(int a, int b){return a-(a/b)*b;} // остаток от деления
function f(int num) // если число однозначное добавляет вначале 0, т. е. 5 станет 05
{
if(size(format(num))<2)return "0"+format(num);
return format(num);
} |
|
|
Dantes3000 |
Отправлено: 15 Декабря, 2018 - 04:06:27
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
Ну... до конца года будет работать)
Спойлер (Отобразить)CODE:int TimeNow=UnixTime()+3600*24*20; // 20 дней
int td[6]; // массив, в котором будут храниться: день, месяц, год, час, мин, сек
date(TimeNow, #td[0]); // передаём в функцию время в секундах и указатель на массив
messagebox(f(td[0])+"."+f(td[1])+"."+f(td[2])+formatic(13)+formatic(10)+
f(td[3])+":"+f(td[4])+":"+f(td[5]));
function UnixTime() // таймштамп + часовой пояс
{
int a[12], Y, M, W, D, h, m, s, mi; getlocaltime(Y, M, W, D, h, m, s, mi);
a[0]=0;a[1]=31;a[2]=59;a[3]=90;a[4]=120;a[5]=151;a[6]=181;a[7]=212;a[8]=243;a[9]=273;a[10]=304;a[11]=334;
return s+m*60+h*3600+((Y-1970)*365+((Y-1972)/4)+a[M-1]+D)*86400;
}
// преобразует таймштамп в нормальную дату и время
function date(int timestamp, int #m[0])
{
int a[12], year, month, day, hour, min, sec;
a[0]=31;a[1]=28;a[2]=31;a[3]=30;a[4]=31;a[5]=30;
a[6]=31;a[7]=31;a[8]=30;a[9]=31;a[10]=30;a[11]=31;
year=1970 + timestamp / 31557600;
day=mod(timestamp / 86400 - (year-1972) / 4, 365);
for(int i=0; i<11 && day - a[i] > a[i]; i++)day=day-a[i];
m[0]=day-a[i]; m[1]=i+2; m[2]=year; m[3]=mod(timestamp / 3600, 24);
m[4]=mod(timestamp / 60, 60); m[5]=mod(timestamp, 60);
}
function mod(int a, int b)
{
int q,r;
q=a/b;
r=a-b*q;
return r;
}
function f(int num) // если число однозначное добавляет вначале 0, т. е. 5 станет 05
{
if(size(format(num))<2)return "0"+format(num);
return format(num);
}
А еще в 4 утра показывает 16 часов |
|
|
Zireael |
Отправлено: 03 Февраля, 2020 - 17:35:02
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Прибавить 10 минут к текущему времени (Отобразить)CODE:external(INT, "GetLocalTime", "GetLocalTime", "Kernel32.dll");
external(INT, "SystemTimeToVariantTime", "SystemTimeToVariantTime", "OleAut32.dll");
external(INT, "VariantTimeToSystemTime", "VariantTimeToSystemTime", "OleAut32.dll");
int hour, min, sec;
time_add(#hour, #min, #sec, 600); // прибавить 600 секунд (10 минут) к текущему времени
messagebox(format(hour)+" "+format(min)+" "+format(sec));
function time_add(int #h, int #m, int #s, int add_seconds)
{
char SYSTEMTIME[16]; double time;
GetLocalTime(address(#SYSTEMTIME[0])); // получить локальное время
SystemTimeToVariantTime(address(#SYSTEMTIME[0]), address(#time)); // перевести в double
time=time + 1 / (86400 * 1000 / add_seconds / 1000); // добавить секунды
VariantTimeToSystemTime(addressi(address(#time)), addressi(address(#time)+4), address(#SYSTEMTIME[0])); // перевести из double в SYSTEMTIME
h=codhexi(#SYSTEMTIME[8], 2); m=codhexi(#SYSTEMTIME[10], 2); s=codhexi(#SYSTEMTIME[12], 2); // записать результат в переменные
}
Прибавить 10 минут к указанному времени (Отобразить)CODE:external(INT, "GetLocalTime", "GetLocalTime", "Kernel32.dll");
external(INT, "SystemTimeToVariantTime", "SystemTimeToVariantTime", "OleAut32.dll");
external(INT, "VariantTimeToSystemTime", "VariantTimeToSystemTime", "OleAut32.dll");
int hour=15, min=45, sec=30; // 15 часов 45 минут 30 секунд
messagebox(format(hour)+" "+format(min)+" "+format(sec));
time_add2(#hour, #min, #sec, 600); // прибавить 600 секунд (10 минут) к указанному времени
messagebox(format(hour)+" "+format(min)+" "+format(sec));
function time_add2(int #h, int #m, int #s, int add_seconds)
{
char SYSTEMTIME[16]; initialarray(#SYSTEMTIME[0], 0);
double time;
SYSTEMTIME[8]=formatic(h); SYSTEMTIME[10]=formatic(m); SYSTEMTIME[12]=formatic(s);
SystemTimeToVariantTime(address(#SYSTEMTIME[0]), address(#time)); // перевести в double
time=time + 1 / (86400 * 1000 / add_seconds / 1000); // добавить секунды
VariantTimeToSystemTime(addressi(address(#time)), addressi(address(#time)+4), address(#SYSTEMTIME[0])); // перевести из double в SYSTEMTIME
h=codhexi(#SYSTEMTIME[8], 2); m=codhexi(#SYSTEMTIME[10], 2); s=codhexi(#SYSTEMTIME[12], 2); // записать результат в переменные
}
Если количество прибавляемых секунд отрицательное число, то они будут не прибавлены, а вычтены.
Помимо времени можно получить дату и день недели после прибавления/вычитания. |
|
|
|