алгоритм преобразования даты и времени в целое число (разработчикам вопрос) - страница 3

 
vasya_vasya >>:

так вот это то и не понятно, почему же не подходит?

потому что - это уже опробовано, и вынесено заключение - тормоза.

 
Urain писал(а) >>

(только перебором на соответствие) а это очень неэфективно.

Зачем перебором? функция же есть? нигде она не будет производительнее, чем внутри самого мт4

StrToTime();
 
HideYourRichess писал(а) >>

потому что - это уже опробовано, и вынесено заключение - тормоза.

покажите ваш алгоритм, а еще лучше, как добиться таких тормозов

 
vasya_vasya >>:

покажите ваш алгоритм, а еще лучше, как добиться таких тормозов

Вася, спасибо вам за ваше участие, но больше ваши советы не требуются.

 
 

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


Нашел, ещё, в DateUtils

function DateTimeToUnix(const AValue: TDateTime): Int64;
function UnixToDateTime(const AValue: Int64): TDateTime;

но, блин, это то же возня с промежуточными датетаймами.


Похоже, действительно время в мт, это временная метка unix. А если это так, то алгоритм преобразования разработчикам то же не известен.

 
Короче, в mktime.c всё это есть.
 
int YearUnixTime(unsigned long N) // результат: год
{
return 1970+N/126230400*4+(N%126230400/31536000>0)+(N%126230400/63072000>0)+(N%126230400/94694400>0);
}
int MonUnixTime(unsigned long N) // результат с 0 по 11
{
unsigned long feb=(N%126230400/63072000>0)&!(N%126230400/94694400>0);
unsigned long u=N-(N/126230400*126230400+(N%126230400/31536000>0)*31536000+(N%126230400/63072000>0)*31536000+(N%126230400/94694400>0)*31622400);
unsigned long z=(u/2678400>0)+(u/(86400*(59+feb))>0)+(u/(86400*(90+feb))>0)+(u/(86400*(120+feb))>0)
+(u/(86400*(151+feb))>0)+(u/(86400*(181+feb))>0)+(u/(86400*(212+feb))>0)+(u/(86400*(243+feb))>0)
+(u/(86400*(273+feb))>0)+(u/(86400*(304+feb))>0)+(u/(86400*(334+feb))>0);
return z;
}

int DataUnixTime(unsigned long N) // результат дата с 1 по 28(29) или 30 или 31
{
int i=0;
unsigned long feb=(N%126230400/63072000>0)&!(N%126230400/94694400>0);
unsigned long u=N-(N/126230400*126230400+(N%126230400/31536000>0)*31536000+(N%126230400/63072000>0)*31536000+(N%126230400/94694400>0)*31622400);
unsigned long z=(u/2678400>0)+(u/(86400*(59+feb))>0)+(u/(86400*(90+feb))>0)+(u/(86400*(120+feb))>0)
+(u/(86400*(151+feb))>0)+(u/(86400*(181+feb))>0)+(u/(86400*(212+feb))>0)+(u/(86400*(243+feb))>0)
+(u/(86400*(273+feb))>0)+(u/(86400*(304+feb))>0)+(u/(86400*(334+feb))>0);
i=u/86400;
i-=31;
if(i<0) i+=31;
else
{
i-=28,i-=feb;
if(i<0) i+=28,i+=feb;
else
{
i-=31;
if(i<0) i+=31;//Март
else
{
i-=30;
if(i<0) i+=30;//Апрель
else
{
i-=31;
if(i<0) i+=31;//Май
else
{
i-=30;
if(i<0) i+=30;//Июнь
else
{
i-=31;
if(i<0) i+=31;//Июль
else
{
i-=31;
if(i<0) i+=31;//Август
else
{
i-=30;
if(i<0) i+=30;//Сентябрь
else
{
i-=31;
if(i<0) i+=31;//Октябрь
else
{
i-=30;
if(i<0) i+=30;//Ноябрь
}
}
}
}
}
}
}
}
}
}
z=i+1;
return z;
}

void tr1251to866(unsigned char& c)
{
if(c>=0xC0&&c<=0xEF) c-=0x40;
else
if(c>=0xF0) c-=0x10;
else
if(c>=0x80&&c<=0x9F) c+=0x40;
else
if(c>=0xAB&&c<=0xAE) c+=0x10;
else
if(c==0xA0) c=0xFF;
else
if(c==0xA1) c=0xF6;
else
if(c==0xA2) c=0xF7;
else
if(c==0xA4) c=0xFD;
else
if(c==0xA8) c=0xF0;
else
if(c==0xAA) c=0xF2;
else
if(c==0xAF) c=0xF4;
else
if(c==0xB0) c=0xF8;
else
if(c==0xB7) c=0xFA;
else
if(c==0xB8) c=0xF1;
else
if(c==0xB9) c=0xFC;
else
if(c==0xBA) c=0xF3;
else
if(c==0xBF) c=0xF5;
else
if(c==0xA3) c=0xF9;
else
if(c==0xA7) c=0xFB;
else
if(c==0xA9) c=0xFE;
else
if(c==0xA5) c=0xB0;
else
if(c==0xA6) c=0xBF;
return;
}



int HourUnixTime(unsigned long N) // результат: час (0..23)
{
unsigned long u=N%86400;
return u/3600;
}

int MinUnixTime(unsigned long N) // результат: минута (0..59)
{
unsigned long u=N%3600;
return u/60;
}

int SecUnixTime(unsigned long N) // результат: секунда (0..59)
{
return N%60;
}




//!!!!!!!!!! Перевод времени в формат UNIX !!!!!!!!!!
unsigned long YearToUnix(int year)
{
unsigned long z=63072000+(year-1972)/4*126230400+(year%4)*31536000+(86400*(year%4>0));
return z;
}


unsigned long MonthToUnix(int N,int year)
{
N--;
const unsigned long Mon[12]={0,2678400,5097600,7776000,10368000,13046400,15638400,18316800,20995200,23587200,26265600,28857600};
unsigned long z;
if ((year%4==0)&&(N>1)) z=Mon[N]+86400; else z=Mon[N];
return z;
}


unsigned long DayToUnix(int N)
{
unsigned long z;
z=(N-1)*86400;
return z;
}


unsigned long HourToUnix(int N)
{
unsigned long z;
z=(N)*3600;
return z;
}


unsigned int MinToUnix(int N)
{
unsigned long z;
z=(N)*60;
return z;
}
 
Блин ну везде двоечники, зачем пробелы убрали :((
 

Alise-17: к такому коду- раз уж так хочется его написать :-) -

не хватает юнит-тестов.

.
Кстати, недвоечники знают :-) что год

... является високосным, если он кратен 4 и при этом не кратен 100, либо кратен 400.

Год не является високосным, если он не кратен 4, либо кратен 100 и не кратен 400.

Причина обращения: