Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизДату в 4 байта Найти похожие ветки
← →
QuickFinder © (2006-08-16 10:50) [0]Дату в 4 байта
Как известно, TDateTime занимает 8 bytes. Как можно дату (число + время) записать в четыре байта? Есть ли какие хитрые алгоритмы для этого?
← →
sniknik © (2006-08-16 10:57) [1]в mssql есть
smalldatetime
Date and time data from January 1, 1900, through June 6, 2079, with accuracy to the minute.
как раз 4 байта... но как видим с потерей точности...
← →
Сергей М. © (2006-08-16 10:58) [2]type
TMyDateTime = single;
var
DateTime: TDateTime;
MyDateTime: TMyDateTime;
..
DateTime:= StrToDateTime("16.08.2006 10:58:00");
MyDateTime := DateTime;
ShowMessage(DateTimeToStr(MyDateTime));
Но учти, что точность представления времени будет ограничено (искажения при преобразовании)
← →
QuickFinder © (2006-08-16 11:06) [3]
> sniknik © (16.08.06 10:57) [1]
> в mssql есть
> smalldatetime
Это как раз то, кажется. Какой там тип данных? Как пишутся данные?
← →
Desdechado © (2006-08-16 11:25) [4]А что за требования на объем такие жесткие? Память в ROM экономишь?
← →
Desdechado © (2006-08-16 11:26) [5]function DateTimeToFileDate(DateTime: TDateTime): Integer;
Integer как раз 4 байта
← →
Separator © (2006-08-16 12:56) [6]Ну вот смотри, это код функции:
function DateTimeToFileDate(DateTime: TDateTime): Integer;
var
Year, Month, Day, Hour, Min, Sec, MSec: Word;
begin
DecodeDate(DateTime, Year, Month, Day);
if (Year < 1980) or (Year > 2107) then Result := 0 else
begin
DecodeTime(DateTime, Hour, Min, Sec, MSec);
LongRec(Result).Lo := (Sec shr 1) or (Min shl 5) or (Hour shl 11);
LongRec(Result).Hi := Day or (Month shl 5) or ((Year - 1980) shl 9);
end;
end;
Давай попробуем разобрать, что в нем происходит.
Для пример возмем такую дату и время:
время = 23 час 12 минут 11 секунд
sec: 11 = 1011 shr 1 = 101
min: 12 = 1100 shl 5 = 110000000
hour: 23 = 10111 shl 11 = 1011100000000000
lo:0000000000000101
or
0000000110000000
or
1011100000000000
----------------
1011100110000101
дата = 1994 год 2 месяц (февраль) 4 день
day: 4 = 100
mon: 2 = 10 shl 5 = 1000000
year = 1994 – 1980 = 14 = 1110 shl 9 = 1110000000000
hi:0000000000100
or
0000001000000
or
1110000000000
-------------
1110001000100
Ну во-первых, видно, что MSec ни где не используется, т.е. миллисекунды отбрасываются, дальше, секунды при преобразовании делятся на 2, при обратном преобразовании соответственно умножатся, т.е. будет погрешность, если секунды равны 55, то при преобразовании станет 27, а при обратном 54
Во-вторых, дата считается не как 1994, а как 14, т.е. нумерация начинается от 1980 года, что сразу уменьшает количество используемых бит на дату, всего 4, день и месяц не сокращаются ни как.
Вот так вот идет сокращение даты, все очень просто, попробуй дальше сделать обратное преобразование с помощью функции function FileDateToDateTime(FileDate: Integer): TDateTime;
← →
Anatoly Podgoretsky © (2006-08-16 19:46) [7]Диапазон Integer состовляет 9 цифр, диапазон даты 8 символов.
← →
Desdechado © (2006-08-17 11:42) [8]Anatoly Podgoretsky © (16.08.06 19:46) [7]
Это к чему?
Да и 9 цифр - неполных.
И автор про дату-время спрашивал, а не чистую дату....
← →
Anatoly Podgoretsky © (2006-08-17 19:06) [9]Ой еще и время спрашивает, до миллисекунды?
← →
QuickFinder © (2006-08-17 19:48) [10]Вопрос решен, особая благодарность Separator-у.
← →
Германн © (2006-08-18 00:37) [11]
> Anatoly Podgoretsky © (17.08.06 19:06) [9]
>
> Ой еще и время спрашивает, до миллисекунды?
>
Ну так он просто не думает :-)
А вот представь какая у меня "лафа" в поддержке прибора, содержащего RTC PCF8583 фирмы Phillips. Там год занимает всего два бита!
-:( Причём 0 это високосный год!
← →
SergP © (2006-08-18 07:23) [12]> -:( Причём 0 это високосный год!
Хм. Для обычных ситуаций - понятно, когда 3 года нормальных и 1 високосный.
А если 7 подряд невисокосных?
← →
SergP © (2006-08-18 07:27) [13]> Как можно дату (число + время) записать в четыре байта?
да элементарно, но с потерей точности и с уменьшением диапазона. Ну это понятно - 8 байт преобразовать в 4 можно только с потерей части информации.
Реши сначала насколько ты согласен потерять точность и насколько уменьшить диапазон, а написать функции преобразования туда-сюда - это не проблема.
← →
QuickFinder © (2006-08-18 10:24) [14]Время интересовало с точностью до минуты. Естественно, при переходе на 4 байта теряется точность, но секунды и миллисекунды не интересовали.
ЕЩЕ РАЗ: вопрос решен, большое спасибо Сепаратору, грамотный специалист.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.014 c