Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1157833620
Kiril
2006-09-10 00:27
2006.10.01
Нужно работать с Excel, как лучше?


15-1157912513
Tar[OFF]
2006-09-10 22:21
2006.10.01
Помогите сделать принтер


9-1136609402
Cash
2006-01-07 07:50
2006.10.01
10000 кубиков


2-1158136961
Gem
2006-09-13 12:42
2006.10.01
Ошибка: Недопустимый флаг преобразования


2-1158094935
Siiiid
2006-09-13 01:02
2006.10.01
прозрачная форма





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский