Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Вниз

Помогите перевести 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.045 c
15-1174651657
Bless
2007-03-23 15:07
2007.04.15
А у нас пыльная буря!


15-1174376700
Bel
2007-03-20 10:45
2007.04.15
Кто-нибудь работал с SAP, MS Navision?


10-1131279789
Shopot
2005-11-06 15:23
2007.04.15
OLE, COM с чего начать?


10-1131124987
Leda
2005-11-04 20:23
2007.04.15
Как кинуть данные в Excel?


2-1174913131
Карман
2007-03-26 16:45
2007.04.15
как запустить файл?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский