Вверх ↑
Этот топик читают: Гость
Ответов: 198
Рейтинг: 2
#1: 2014-03-07 14:39:12 ЛС | профиль | цитата
Всем привет!

Знаю, что глупый вопрос, или я слепой, но подскажите как получить абсолютное время?

Т.е. в формате: 139418хххх
карма: 0

0
Ответов: 8928
Рейтинг: 823
#2: 2014-03-07 14:54:29 ЛС | профиль | цитата
SkyPrinceRus, абсолютное время, так же как и температура, начинается с абсолютного нуля, т. е. с Большого Взрыва, а сколько времени прошло с того момента никто не знает Так что надо начинать с какого-то момента, например, от рождества Христова, или от сотворения мира Богом, или от 01.01.1900 года -- это от Билла
code_33204.txt
карма: 19

0
файлы: 1code_33204.txt [255B] [190]
Ответов: 4631
Рейтинг: 749
#3: 2014-03-07 15:01:37 ЛС | профиль | цитата
Только ему нужно не "от Билла", а от "эры Unix". В конверторе - режим DateRealToDateUnix
карма: 26

0
Ответов: 198
Рейтинг: 2
#4: 2014-03-07 15:14:13 ЛС | профиль | цитата
Леонид, благодарю за конвертер

Netspirit, все верно, я увидел конвертацию, спасибо!
------------ Дoбавленo в 15.11:
Может кто еще подскажет, почему Java выдает одно время, а HiASM другое?



В Java:

long timestamp = System.currentTimeMillis()/1000;
System.out.println(timestamp);

------------ Дoбавленo в 15.14:
А-а, ну да, погрешность на часовой пояс (+11 GMT)... можно как-то отвязать время от часовго пояса Windows? Просто везде разные часовые пояса будут
карма: 0

0
Ответов: 4631
Рейтинг: 749
#5: 2014-03-07 15:25:41 ЛС | профиль | цитата
Хе, а это не совсем тривиальная задача - нужно вытащить из настроек системы смещение времени от Гринвича и вычесть из выдаваемого системой времени.
карма: 26

0
Ответов: 198
Рейтинг: 2
#6: 2014-03-07 16:12:48 ЛС | профиль | цитата
А можно их как-то выдернуть? Только что бы на системах работало от ХР до 8-ки


------------ Дoбавленo в 16.12:


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



Add(MainForm,2953706,154,126)
{
link(onCreate,11483292:doRead,[])
}
Add(DateConvertor,11209666,364,259)
{
Mode=19
link(onResult,619692:doCalc,[])
}
Add(Time,9585562,308,203)
{
Point(DateTime)
}
Add(Edit,247426,504,259)
{
Left=45
Top=20
Width=145
}
Add(Timer,475025,266,259)
{
link(onTimer,16362017:doData,[])
}
Add(DoData,16362017,315,259)
{
link(onEventData,11209666:doConvert,[])
link(Data,9585562:DateTime,[])
}
Add(Registry,11483292,238,140)
{
HKey=2
Key="SYSTEMCurrentControlSetControlTimeZoneInformation"
Value="Bias"
DataType=0
link(onRead,11754459:doSplit,[])
}
Add(StrPart,11754459,308,140)
{
Char="-"
Point(onNotFound)
link(onSplit,6401316:doWork2,[])
link(onNotFound,6401316:doWork3,[(396,160)])
}
Add(HubEx,6401316,392,140)
{
link(onEvent,9118996:doValue,[])
}
Add(Memory,9118996,434,140)
{
}
Add(MathParse,619692,427,259)
{
MathStr="%1 - (%2/60*3600)"
link(onResult,247426:doText,[])
link(X2,9118996:Value,[])
}

карма: 0

0
Ответов: 4631
Рейтинг: 749
#7: 2014-03-07 16:38:50 ЛС | профиль | цитата
Сейчас попробую.
------------ Дoбавленo в 16.38:
Вот как-то так:

Add(MainForm,2953706,21,105)
{
Width=292
Height=226
Position=1
}
Add(Button,3342741,287,154)
{
Left=25
Top=20
Data=String(ABCDEF)
link(onClick,7763379:doData,[])
}
Add(Time,4805613,329,91)
{
Point(DateTime)
}
Add(InlineCode,10542117,448,280)
{
WorkPoints=#90:doTimeToUTC=Превращает локальную DateReal в UTC DateReal исходя из настроек часового пояса|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|30:uses Windows, kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|27: onResult:THI_Event; |56: procedure doTimeToUTC(var _Data:TData; index:word);|5: end;|0:|5:const|35: UnixStartDate: TDateTime = 25569;|0:|4:var |35: OffsetFromUTC: Integer; // Минуты|2: |14:implementation|0:|0:|35:function GetOffsetFromUTC: Integer;|3:var|17: iBias: Integer;|29: tmez: TTimeZoneInformation;|5:begin|13: iBias := 0;|0:|38: case GetTimeZoneInformation(tmez) of|27: TIME_ZONE_ID_UNKNOWN :|26: iBias := tmez.Bias;|27: TIME_ZONE_ID_DAYLIGHT :|9: begin|25: iBias := tmez.Bias;|43: if tmez.DaylightDate.wMonth <> 0 then|11: begin|43: iBias := iBias + tmez.DaylightBias;|10: end;|8: end;|27: TIME_ZONE_ID_STANDARD :|9: begin|25: iBias := tmez.Bias;|43: if tmez.StandardDate.wMonth <> 0 then|11: begin|43: iBias := iBias + tmez.StandardBias;|10: end;|7: end|6: end;|4: |70: {The GetTimeZone function returns values oriented towards converting|73: a GMT time into a local time. We wish to do the opposite by returning|76: the difference between the local time and GMT. So I just make a positive|57: value negative and leave a negative value as positive}|0:|19: Result := -iBias;|4:end;|0:|0:|0:|64:procedure THiAsmClass.doTimeToUTC(var _Data:TData; index:word); |3:var|11: DT: Real;|5:begin|22: DT := ToReal(_Data);|36: DT := DT - (OffsetFromUTC / 1440);|40: _hi_CreateEvent(_Data, @onResult, DT);|4:end;|0:|0:|14:initialization|36: OffsetFromUTC := GetOffsetFromUTC;|0:|4:end.|
link(onResult,16384554:doConvert,[])
}
Add(DoData,7763379,336,154)
{
link(onEventData,11927620:doEvent1,[])
link(Data,4805613:DateTime,[])
}
Add(ListBox,12157137,812,154)
{
Left=25
Top=50
Width=200
Height=115
}
Add(Hub,9546187,581,154)
{
link(onEvent1,14375896:doEvent1,[])
link(onEvent2,4484966:doConvert,[])
}
Add(Hub,14375896,770,154)
{
InCount=4
OutCount=1
link(onEvent1,12157137:doAdd,[])
}
Add(Hub,7211647,602,280)
{
link(onEvent1,5713220:doStrCat,[(640,286)(640,244)])
link(onEvent2,12032341:doConvert,[])
}
Add(DateConvertor,12032341,658,287)
{
Mode=16
link(onResult,2324350:doStrCat,[])
}
Add(DateConvertor,4484966,623,161)
{
Mode=16
link(onResult,14375896:doEvent2,[])
}
Add(DateConvertor,14686218,532,154)
{
Mode=19
link(onResult,9546187:doEvent1,[])
}
Add(Hub,11927620,399,154)
{
link(onEvent1,14686218:doConvert,[])
link(onEvent2,10542117:doTimeToUTC,[(423,167)(423,286)])
}
Add(DateConvertor,16384554,532,280)
{
Mode=19
link(onResult,7211647:doEvent1,[])
}
Add(StrCat,2324350,707,287)
{
Str1="UTC: "
link(onStrCat,14375896:doEvent4,[(751,293)(751,181)])
}
Add(StrCat,5713220,658,238)
{
Str1="UTC: "
link(onStrCat,14375896:doEvent3,[(709,244)(709,174)])
}
Можно в конвертер добавить свойство, включающее преобразование входной/выходной даты в/из Local/UTC. Или ещё лучше, добавить две точки в Time: UTCOffsetReal, UTCOffsetUnix. Первая используется для вычисления DateReal и VCLDate, а вторая - DateUnix. Значения этих точек нужно добавлять/отнимать от соответствующих дат.
карма: 26

0
Ответов: 198
Рейтинг: 2
#8: 2014-03-07 17:04:37 ЛС | профиль | цитата
Netspirit, Благодарю! Выглядит куда надежнее
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#9: 2014-03-07 20:31:55 ЛС | профиль | цитата
SkyPrinceRus, твоя схема (если выбросить всё лишнее) тоже надежная.
code_33208.txt

И как это же решается в IC без применения "индусского кода":

Add(MainForm,9703046,126,203)
{
Width=292
Height=226
Position=1
}
Add(Button,3342741,126,140)
{
Left=25
Top=20
Data=String(ABCDEF)
link(onClick,7763379:doData,[])
}
Add(Time,4805613,182,77)
{
Point(DateTime)
}
Add(DoData,7763379,189,140)
{
link(onEventData,11927620:doEvent1,[])
link(Data,4805613:DateTime,[])
}
Add(ListBox,12157137,483,140)
{
Left=25
Top=50
Width=200
Height=115
}
Add(Hub,9546187,336,140)
{
link(onEvent1,13469378:doStrCat,[(368,146)(368,118)])
link(onEvent2,4484966:doConvert,[])
}
Add(Hub,14375896,448,140)
{
InCount=4
OutCount=1
link(onEvent1,12157137:doAdd,[])
}
Add(Hub,7211647,336,217)
{
link(onEvent1,5713220:doStrCat,[(360,223)(360,195)])
link(onEvent2,12032341:doConvert,[])
}
Add(DateConvertor,12032341,378,224)
{
Mode=16
Format="UTC: dd-MM-yyyy HH:mm:ss"
link(onResult,14375896:doEvent4,[(432,230)(432,167)])
}
Add(DateConvertor,4484966,378,147)
{
Mode=16
Format="LOC: dd-MM-yyyy HH:mm:ss"
link(onResult,14375896:doEvent2,[])
}
Add(DateConvertor,14686218,287,140)
{
Mode=19
link(onResult,9546187:doEvent1,[])
}
Add(Hub,11927620,238,140)
{
OutCount=3
link(onEvent1,14686218:doConvert,[])
link(onEvent3,1750949:doTest,[(262,160)(262,223)])
}
Add(StrCat,5713220,378,189)
{
Str1="UTC: "
link(onStrCat,14375896:doEvent3,[(422,195)(422,160)])
}
Add(InlineCode,1750949,287,217)
{
WorkPoints=#6:doTest|
EventPoints=#6:onTest|
Code=#17:unit HiAsmUnit; |6:// Tad|9:interface|0:|29:uses windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|14: Res:TData;|9: public|21: onTest:THI_Event;|50: procedure doTest(var _Data:TData; Index:Word);|5: end;|16:var hP:Integer;|29: tm:TTimeZoneInformation;|3: |14:implementation|0:|1: |29:procedure THiAsmClass.doTest;|5:begin|72: dtInteger(Res,Round((toReal(_Data) - 25569 - VCLDATE0 ) * 86400 + hp));|25: _hi_onEvent(onTest,Res);|4:end;|0:|14:initialization|28: GetTimeZoneInformation(tm);|16: hP:=tm.bias*60;|4:end.|
link(onTest,7211647:doEvent1,[])
}
Add(StrCat,13469378,378,112)
{
Str1="LOC:"
link(onStrCat,14375896:doEvent1,[(420,118)(420,146)])
}



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_33208.txt [827B] [195]
Ответов: 16884
Рейтинг: 1239
#10: 2014-03-09 20:22:16 ЛС | профиль | цитата
Netspirit писал(а):
добавить две точки в Time: UTCOffsetReal, UTCOffsetUnix.
Две не надо, а вот добавить одну - не помешает.
code_33211.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_33211.txt [220B] [158]
Ответов: 4631
Рейтинг: 749
#11: 2014-03-09 21:07:52 ЛС | профиль | цитата
А если нужно дату из других источников преобразовать?
карма: 26

0
Ответов: 16884
Рейтинг: 1239
#12: 2014-03-09 21:34:23 ЛС | профиль | цитата
Netspirit писал(а):
А если нужно дату из других источников преобразовать?
Для этого есть DateConvertor. Добавлять нужно в него.
UTCTime <--> LocalTime в обе стороны.

Вот примерно как-то так:

procedure THIDateConvertor._work_doConvertXX;//DateLocalToDateUTC
var dl:double;
hp:TTimeZoneInformation;
begin
GetTimeZoneInformation(hp);
dl:= ReadReal(_Data,_data_Data,0);
dtReal(Fresult,dl+(hp.bias/1440));
_hi_CreateEvent(_Data,@_event_onResult, FResult);
end;

procedure THIDateConvertor._work_doConvertXX;//DateUTCtoDateLocal
var dl:double;
hp:TTimeZoneInformation;
begin
GetTimeZoneInformation(hp);
dl:= ReadReal(_Data,_data_Data,0);
dtReal(Fresult,dl-(hp.bias/1440));
_hi_CreateEvent(_Data,@_event_onResult, FResult);
end;

Но это на суд nesco
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 4631
Рейтинг: 749
#13: 2014-03-10 12:02:42 ЛС | профиль | цитата
А что было названо "индусским кодом"? Учитывание всех полей структуры TTimeZoneInformation? Я конечно не совсем представляю назначение этих полей, но для того чтобы их выбросить все-же нужны аргументы...
карма: 26

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)