Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Int64. Непонятный формат времени.


Автор: d3lp 27.8.2009, 11:02
Здрасте. Имеется 8 байтовая последовательность символов, после ее перевода в hex получается число с обратным порядком байт (little-endian): 40E3861462833945, далее перевожу это в Int64: 4675728260250941765

Следующий код переводит это число в дату:
Цитата
var
  Date64: Int64;
  sDate64: TDateTime absolute Date64;
  Hex: String;
begin
  Hex := '40E3861462833945';
  Date64 := HexToInt64(Hex); // 4675728260250941765
  ShowMessage(DateTimeToStr(sDate64)); // 20.06.2009 15:17:19
end;


Все самое главное проделывает одна строчка sDate64: TDateTime absolute Date64;

Вопрос: что это за формат времени такой 40E3861462833945 и как еще из него можно получить дату 20.06.2009 15:17:19 без использования директивы absolute (для повторения этого на других языках) ??

Автор: CodeMonkey 27.8.2009, 12:29
http://transl-gunsmoker.blogspot.com/2008/11/blog-post_24.html.

Автор: Romikgy 27.8.2009, 12:30
Код

ShowMessage(DateTimeToStr( TDateTime (Date64 )));

Автор: CodeMonkey 27.8.2009, 12:31
P.S. Т.к. используется DateTimeToStr, то это - TDateTime или формат даты OLE.

Автор: kami 27.8.2009, 13:04
Цитата(d3lp @  27.8.2009,  11:02 Найти цитируемый пост)
Все самое главное проделывает одна строчка

Ничего главного она не проделывает. Просто указывает, что Date64 и sDate64 по сути дела одна переменная (т.е. занимают одну и ту же область памяти). Int64=8 байт, TDateTime=Double=8 байт, т.е. переменные идентичны по размеру друг другу. И в итоге получается, что Int64-значение при доступе к нему через sDate64 "расщепляется" на мантиссу и экспоненту. (как - см. в хелпе). Формат времени - стандартный для Delphi начиная с версии 2 (тоже - см. справку по TDateTime).
Переделать код можно так, правда при этом теряется расположение переменных по одному и тому же адресу, но мне бы использовать директиву absolute просто не пришло бы в голову (никогда ей не пользовался, не хочу этим сказать что она "плохая" или "хорошая" - просто не было необходимости).

Код

  Hex := '40E3861462833945';
  Date64:=HexToInt64(Hex);
  Move(Date64, sDate64, SizeOf(TDateTime)); // при использовании absolute это делается "автоматически",  
      //вернее - вообще не делается, потому что не за чем.
  ShowMessage(DateTimeToStr(sDate64));


Автор: d3lp 27.8.2009, 13:47
Всем Спасибо, разъяснили)

Автор: Romikgy 27.8.2009, 20:22
Цитата(kami @  27.8.2009,  12:04 Найти цитируемый пост)
 Move(Date64, sDate64, SizeOf(TDateTime)); // при использовании absolute это делается "автоматически",  

при абсолюте не производится копирования, использует одна переменая , и передаются указатели на нее

Автор: kami 27.8.2009, 22:06
Цитата(Romikgy @  27.8.2009,  20:22 Найти цитируемый пост)
при абсолюте не производится копирования, использует одна переменая , и передаются указатели на нее

Цитируй, пожалуйста, комментарии полностью. Потому что строчкой ниже именно это и было сказано:
Цитата(kami @  27.8.2009,  13:04 Найти цитируемый пост)
 //вернее - вообще не делается, потому что не за чем.


Добавлено через 1 минуту и 43 секунды
Ну, и выше это тоже было разъяснено:
Цитата(kami @  27.8.2009,  13:04 Найти цитируемый пост)
 Date64 и sDate64 по сути дела одна переменная (т.е. занимают одну и ту же область памяти).


Автор: Romikgy 28.8.2009, 10:00
kami, зачем тогда добавлять не нужные ( не корректные ) данные в свой пост ?

Автор: kami 28.8.2009, 12:56
Romikgy, 
Почему не нужные и некорректные?
Изначально вопрос звучал, как то же самое можно сделать без использования absolute.
Вот я и изложил свое мнение по этому поводу, о чем опять-таки прямо сказал в том сообщении:
Цитата(kami @  27.8.2009,  13:04 Найти цитируемый пост)
Переделать код можно так, правда при этом теряется расположение переменных по одному и тому же адресу, но мне бы использовать директиву absolute просто не пришло бы в голову (никогда ей не пользовался, не хочу этим сказать что она "плохая" или "хорошая" - просто не было необходимости).

И пояснил код, как умею. Старался, чтобы вышло максимально понятно и прозрачно при прочтении всего сообщения.
Если ввел в заблуждение - прошу прощения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)