Текущий архив: 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.5 MB
Время: 0.031 c