Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

Помогите перевести TDataTime в SYSTEMTIME без модуля SysUtils   Найти похожие ветки 

 
Dmitry_177   (2007-03-27 19:24) [0]

Помогите пожалуйста перевести TDataTime в SYSTEMTIME без модуля SysUtils.. TDataTime это тоже самое что и Double, вот его и надо перевести в SYSTEMTIME.. Но без модуля SysUtils! DateTimeToSystemTime не предлагайте, т.к. он из того модуля.. Помогите мне пожалуйста очень нужно..


 
Dmitry_177   (2007-03-27 19:27) [1]

нашел в интернете перевод из SYSTEMTIME в TDataTime на ассемблере, написано в FASM-е.. помогите сделать обратное.. Я в ассемблере ничего не понимаю, а очень нужно... Если что, ассемблерный ком можно же вставлять в Delphi

;========================================
;C/C++
;  void __stdcall SysTimeToDateTime(CONST SYSTEMTIME * lpST; TDateTime * lpDT)
;Delphi
;  procedure SysTimeToDate(const ST:TSystemTime;var DT:TDateTime);stdcall;
;type TDateTime = type Double
;  The integral part of a TDateTime value is the number of days that have passed since 12/30/1899
;  The fractional part of a TDateTime value is the time of day
;========================================
;FASM
SysTimeToDateTime:
 DateDelta = 693594  ;Days between 1/1/0001 and 12/31/1899
 virtual at ebp
   lpST SYSTEMTIME
 end virtual
push ebp
mov  ebp,[esp+8] ;lpST
push ebx
push edi
push esi
push 0   ;local dword

movzx eax,[lpST.wYear]
xor edx,edx
mov edi,eax
mov ecx,100
div ecx   ;eax - число годов кратных 100; edx <> 0 - текущий год кратен 100
imul esi,edi,365 ;esi - число дней без учета високосных

;пока выполняются div и imul делаем вспомогательные вычисления
movzx ebx,[lpST.wMonth]
xor ecx,ecx  ;проверяем необходимость коррекции числа дней на 1, если year - високосный
cmp ebx,2  ;коррекция нужна будет только для янв.и фев.
setg cl   ;
or ecx,edi  ;орим с годом
and ecx,3  ;ecx = 0 - возможно нужна коррекция (год кратен 4 и месяц < 3)

movzx ebx,word[ebx*2+.SubMonDays-2] ;число дней от начала месяца до конца года
add ebx,DateDelta  ;поправка к началу отсчета дней в TDateTime
shr edi,2    ;edi = число годов кратных 4 = число доп.високос.дней (без учета 100 и 400)
sub edi,ebx    ;вычли остаток дней до конца кода и поправку DateDelta

movzx ebx,[lpST.wDay]
add edi,esi    ;добавили результат imul - число дней за year лет
add edi,ebx    ;edi - полное число дней
        ;осталось еще скоректировать на 100\400 и янв\фев, если год - високосный
   ;----------
movzx esi,[lpST.wHour] ;запускаем вычисление миллисекунд
imul esi,3600000
movzx ebx,[lpST.wMinute]
imul ebx,60000
add  ebx,esi
movzx  esi,[lpST.wSecond]
imul  esi,1000
add  esi,ebx
   ;----------
dec ecx
sar ecx,2      ;ecx - коррекция числа дней текущего года (0 или -1)

;---- тут должен подоспеть результат деления на 100 в eax:edx ----
xor ebx,ebx
test eax,3     ;контроль кратности года 400
setz bl
or edx,ebx     ;edx = 0 - не високосный (кратен 100, но не кратен 400)

   ;---------
movzx ebx,[lpST.wMilliseconds]
add   ebx,esi
mov [esp],ebx
   ;-----------

add edx,-1     ;перенос если не 0
sbb edx,edx    ;0 - не високосный, -1 високосный
and edx,ecx    ;поправка к числу дней текущего года (-1 или 0)

sub edi,eax    ;вычли число годов кратных 100
shr eax,2      ;число годов кратных 400
add eax,edi    ;добавили число годов кратных 100
add eax,edx    ;скорректировали на 1, если янв\фев високосного года

;----------------
fild dword[esp]
mov [esp],eax
fmul qword[.MSecPerDay]
fiadd dword[esp]

pop eax
pop esi
pop edi
pop ebx
pop ebp
mov eax,[esp+8]
fstp qword[eax]
ret 8
align 8
.SubMonDays:
dw 365  ;янв
dw 365-31  ;фев
dw 365-31-28  ;март
dw 365-31-28-31  ;апр
dw 365-31-28-31-30  ;май
dw 365-31-28-31-30-31  ;июнь
dw 31+30+31+30+31+31 ;июль
dw 31+30+31+30+31 ;авг
dw 31+30+31+30 ;сен
dw 31+30+31 ;окт
dw 31+30 ;ноя
dw 31 ;дек
.MSecPerDay: dq 1.15740740740740740740740740740741e-8 ;=1/(24*60*60*1000)


 
Kedge ©   (2007-03-27 20:12) [2]

А кто мешает "выдернуть" из SysUtils DateTimeToSystemTime (вместе с тем, на что она ссылается)?


 
Dmitry_177   (2007-03-27 20:14) [3]

Kedge, ненадо этого делать... там слишком замудренно как-то.. я думаю можно намного проще сделать..


 
Kedge ©   (2007-03-27 20:20) [4]

>[3] Dmitry_177   (27.03.07 20:14)
>там слишком замудренно как-то..
Да нет. Пять - шесть копи-пайстов и "золотой ключик у нас в кармане" (с) :)


 
Dmitry_177   (2007-03-27 20:21) [5]

Kedge, увы этот вариант мне не подходит...=(


 
Джо ©   (2007-03-27 20:22) [6]

> [3] Dmitry_177   (27.03.07 20:14)
> там слишком замудренно как-то..

«Программирование — несложная дисциплина. Что-то вроде проектирования небоскребов или мостов».

(с) вольное изложение кого-то из классиков.


 
Dmitry_177   (2007-03-27 20:25) [7]

издеваетесь...


 
Loginov Dmitry ©   (2007-03-27 20:26) [8]

> Помогите пожалуйста перевести TDataTime в SYSTEMTIME без
> модуля SysUtils.


Почему-то до сих пор никто не спросил - НАХРЕНА?


 
Leonid Troyanovsky ©   (2007-03-27 20:29) [9]


> Dmitry_177   (27.03.07 19:24)  

> Помогите пожалуйста перевести TDataTime в SYSTEMTIME без
> модуля SysUtils..

Во, блин, обленились.
А в sysutils заглянуть религия запрещает?
Вообще-то, TDateTime это кол-во дней, выраженное aka Double.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-03-27 20:31) [10]


> Loginov Dmitry ©   (27.03.07 20:26) [8]

> Почему-то до сих пор никто не спросил - НАХРЕНА?

А нахрена спрашивать? И так понятно.
Неитересно, т.е.

--
Regards, LVT.


 
Dmitry_177   (2007-03-27 20:39) [11]


> Во, блин, обленились. А в sysutils заглянуть религия запрещает?
> Вообще-то, TDateTime это кол-во дней, выраженное aka Double.
>

я знаю это... и я заглядывал...

Вот например тип TTimeStamp, зачем он мне нужен, если мне напрямую нужно...

а еще  что значит:

{$IFDEF PIC}
{$ELSE}
{$ENDIF}
[/code]
я понимаю что какое-то условие, но какое?
а еще:
[code=delphi]
{$IFDEF MSWINDOWS}
{$ENDIF}


и еще вопрос, в функции DateTimeToTimeStamp из SysUtils есть такой момент:

       CALL    GetGOT


а сама функция GetGOT выглядит так:

function GetGOT: Pointer; export;
begin
 asm
       MOV     Result,EBX
 end;
end;


вот как ее можно вставить в DateTimeToTimeStamp, чтобы небыло ничего лишнего?


 
Leonid Troyanovsky ©   (2007-03-27 20:51) [12]


> Dmitry_177   (27.03.07 20:39) [11]

> я знаю это... и я заглядывал...

И увидел?

Вот  

 _SYSTEMTIME = record
   wYear: Word;
   wMonth: Word;
   wDayOfWeek: Word;
   wDay: Word;
   wHour: Word;
   wMinute: Word;
   wSecond: Word;
   wMilliseconds: Word;
 end;


Хочешь сказать, что перевести оное в количество суток
aka Double затруднительно?

Надо хоть немного напрягать мыслительную мышцу.

--
Regards, LVT.


 
Dmitry_177   (2007-03-27 20:58) [13]

ну спасибо вам огромное! =((


 
Плохиш ©   (2007-03-27 22:02) [14]

Раз уж мы до сих пор в "Основная", то скажу. Это форум для программистов или желающих ими стать, а не для тормозов с одной извилиной.


 
Степан   (2007-03-27 23:14) [15]

TDateTime - не сложный формат :) В целой части числа хранится дата (а именно количество суток, прошедших с 30 декабря 1899г), в дробной - время, как часть суток... подключаем модуль "мозг.pas" и фперед!


 
Kedge ©   (2007-03-27 23:48) [16]

>[15] Степан   (27.03.07 23:14)
>подключаем модуль "мозг.pas"
Эх ! Такой бы модуль ! Хоть одним глазком глянуть на исходники !
А то у меня в наличие только "мозг.dcu"  :)


 
Dmitry_177   (2007-03-28 00:09) [17]

Добрые люди подсказали вот такую процедуру:

procedure _DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
var
 FT:TFileTime;
begin
 Int64(FT):=Round((DateTime+109205.0)*864000000000.0);
 FileTimeToSystemTime(FT,SystemTime);
end;

Правильная ли она?


 
Плохиш ©   (2007-03-28 01:24) [18]


> Dmitry_177   (28.03.07 00:09) [17]

DecodeDateTime + F1



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.081 c
2-1174569990
Chaval'
2007-03-22 16:26
2007.04.15
файл


1-1171744798
Nicky000
2007-02-17 23:39
2007.04.15
Как сделать главное меню в нестандартной форме?


1-1171893072
tytus
2007-02-19 16:51
2007.04.15
Доступ к Java 1.4.2_05 из Delphi


2-1174684736
ramil_yunaliev
2007-03-24 00:18
2007.04.15
ASP.NET и Delphi 2005


2-1174917088
Sergionio
2007-03-26 17:51
2007.04.15
combobox и список таблиц