Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2021, 11:06   #1
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию Формат TDateTime

Здравствуйте!

Формат TDateTime выдает неверный результат, если дата менее 30 декабря 1899 года:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var t: TDateTime;
    s: string;
begin
   Memo1.Clear;
   t:=-3;
   repeat
      s:=FormatDateTime('dd.mm.yyyy hh:nn:ss', t);
      Memo1.Lines.Add(Format('%.5f = %s', [t, s]));
      t:=t+1/24;
   until t>=3;
end;
Вывод Memo:
Цитата:
-3,00000 = 27.12.1899 00:00:00
-2,95833 = 28.12.1899 23:00:00
-2,91667 = 28.12.1899 22:00:00
-2,87500 = 28.12.1899 21:00:00
-2,83333 = 28.12.1899 20:00:00
-2,79167 = 28.12.1899 19:00:00
-2,75000 = 28.12.1899 18:00:00
-2,70833 = 28.12.1899 17:00:00
-2,66667 = 28.12.1899 16:00:00
-2,62500 = 28.12.1899 15:00:00
-2,58333 = 28.12.1899 14:00:00
-2,54167 = 28.12.1899 13:00:00
-2,50000 = 28.12.1899 12:00:00
-2,45833 = 28.12.1899 11:00:00
-2,41667 = 28.12.1899 10:00:00
-2,37500 = 28.12.1899 09:00:00
-2,33333 = 28.12.1899 08:00:00
-2,29167 = 28.12.1899 07:00:00
-2,25000 = 28.12.1899 06:00:00
-2,20833 = 28.12.1899 05:00:00
-2,16667 = 28.12.1899 04:00:00
-2,12500 = 28.12.1899 03:00:00
-2,08333 = 28.12.1899 02:00:00
-2,04167 = 28.12.1899 01:00:00
-2,00000 = 28.12.1899 00:00:00
-1,95833 = 29.12.1899 23:00:00
-1,91667 = 29.12.1899 22:00:00
-1,87500 = 29.12.1899 21:00:00
-1,83333 = 29.12.1899 20:00:00
-1,79167 = 29.12.1899 19:00:00
-1,75000 = 29.12.1899 18:00:00
-1,70833 = 29.12.1899 17:00:00
-1,66667 = 29.12.1899 16:00:00
-1,62500 = 29.12.1899 15:00:00
-1,58333 = 29.12.1899 14:00:00
-1,54167 = 29.12.1899 13:00:00
-1,50000 = 29.12.1899 12:00:00
-1,45833 = 29.12.1899 11:00:00
-1,41667 = 29.12.1899 10:00:00
-1,37500 = 29.12.1899 09:00:00
-1,33333 = 29.12.1899 08:00:00
-1,29167 = 29.12.1899 07:00:00
-1,25000 = 29.12.1899 06:00:00
-1,20833 = 29.12.1899 05:00:00
-1,16667 = 29.12.1899 04:00:00
-1,12500 = 29.12.1899 03:00:00
-1,08333 = 29.12.1899 02:00:00
-1,04167 = 29.12.1899 01:00:00
-1,00000 = 29.12.1899 00:00:00
-0,95833 = 30.12.1899 23:00:00
-0,91667 = 30.12.1899 22:00:00
-0,87500 = 30.12.1899 21:00:00
-0,83333 = 30.12.1899 20:00:00
-0,79167 = 30.12.1899 19:00:00
-0,75000 = 30.12.1899 18:00:00
-0,70833 = 30.12.1899 17:00:00
-0,66667 = 30.12.1899 16:00:00
-0,62500 = 30.12.1899 15:00:00
-0,58333 = 30.12.1899 14:00:00
-0,54167 = 30.12.1899 13:00:00
-0,50000 = 30.12.1899 12:00:00
-0,45833 = 30.12.1899 11:00:00
-0,41667 = 30.12.1899 10:00:00
-0,37500 = 30.12.1899 09:00:00
-0,33333 = 30.12.1899 08:00:00
-0,29167 = 30.12.1899 07:00:00
-0,25000 = 30.12.1899 06:00:00
-0,20833 = 30.12.1899 05:00:00
-0,16667 = 30.12.1899 04:00:00
-0,12500 = 30.12.1899 03:00:00
-0,08333 = 30.12.1899 02:00:00
-0,04167 = 30.12.1899 01:00:00
0,00000 = 30.12.1899 00:00:00
0,04167 = 30.12.1899 01:00:00
0,08333 = 30.12.1899 02:00:00
0,12500 = 30.12.1899 03:00:00
0,16667 = 30.12.1899 04:00:00
0,20833 = 30.12.1899 05:00:00
0,25000 = 30.12.1899 06:00:00
0,29167 = 30.12.1899 07:00:00
0,33333 = 30.12.1899 08:00:00
0,37500 = 30.12.1899 09:00:00
0,41667 = 30.12.1899 10:00:00
0,45833 = 30.12.1899 11:00:00
0,50000 = 30.12.1899 12:00:00
0,54167 = 30.12.1899 13:00:00
0,58333 = 30.12.1899 14:00:00
0,62500 = 30.12.1899 15:00:00
0,66667 = 30.12.1899 16:00:00
0,70833 = 30.12.1899 17:00:00
0,75000 = 30.12.1899 18:00:00
0,79167 = 30.12.1899 19:00:00
0,83333 = 30.12.1899 20:00:00
0,87500 = 30.12.1899 21:00:00
0,91667 = 30.12.1899 22:00:00
0,95833 = 30.12.1899 23:00:00
1,00000 = 31.12.1899 00:00:00
1,04167 = 31.12.1899 01:00:00
1,08333 = 31.12.1899 02:00:00
1,12500 = 31.12.1899 03:00:00
1,16667 = 31.12.1899 04:00:00
1,20833 = 31.12.1899 05:00:00
1,25000 = 31.12.1899 06:00:00
1,29167 = 31.12.1899 07:00:00
1,33333 = 31.12.1899 08:00:00
1,37500 = 31.12.1899 09:00:00
1,41667 = 31.12.1899 10:00:00
1,45833 = 31.12.1899 11:00:00
1,50000 = 31.12.1899 12:00:00
1,54167 = 31.12.1899 13:00:00
1,58333 = 31.12.1899 14:00:00
1,62500 = 31.12.1899 15:00:00
1,66667 = 31.12.1899 16:00:00
1,70833 = 31.12.1899 17:00:00
1,75000 = 31.12.1899 18:00:00
1,79167 = 31.12.1899 19:00:00
1,83333 = 31.12.1899 20:00:00
1,87500 = 31.12.1899 21:00:00
1,91667 = 31.12.1899 22:00:00
1,95833 = 31.12.1899 23:00:00
2,00000 = 01.01.1900 00:00:00
2,04167 = 01.01.1900 01:00:00
2,08333 = 01.01.1900 02:00:00
2,12500 = 01.01.1900 03:00:00
2,16667 = 01.01.1900 04:00:00
2,20833 = 01.01.1900 05:00:00
2,25000 = 01.01.1900 06:00:00
2,29167 = 01.01.1900 07:00:00
2,33333 = 01.01.1900 08:00:00
2,37500 = 01.01.1900 09:00:00
2,41667 = 01.01.1900 10:00:00
2,45833 = 01.01.1900 11:00:00
2,50000 = 01.01.1900 12:00:00
2,54167 = 01.01.1900 13:00:00
2,58333 = 01.01.1900 14:00:00
2,62500 = 01.01.1900 15:00:00
2,66667 = 01.01.1900 16:00:00
2,70833 = 01.01.1900 17:00:00
2,75000 = 01.01.1900 18:00:00
2,79167 = 01.01.1900 19:00:00
2,83333 = 01.01.1900 20:00:00
2,87500 = 01.01.1900 21:00:00
2,91667 = 01.01.1900 22:00:00
2,95833 = 01.01.1900 23:00:00
3,00000 = 02.01.1900 00:00:00
Как так? Есть ли корректный способ отображения?
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 11.07.2021, 11:24   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
Формат TDateTime выдает неверный результат, если дата менее 30 декабря 1899 года
Читаем про данный формат тут - http://www.delphibasics.ru/TDateTime.php

Тип TDateTime содержит значение даты и времени.

Она сохраняется как переменная Double, с датой как целая часть, а время как дробная. Дата сохраняется как число дней с 30 декабря 1899. Не понятно, почему не 31 декабря. 01 января 1900 имеет значение 2.

Поскольку TDateTime фактически является Double, то вы можете выполнять над ним вычисления, как будто это было число. Это очень полезно для вычислений типа разницы между двумя датами.


Для работы с датой и временем можно создать свой собственный тип:

Код:
type TMyDateTime = record
  Day: 1..31;
  Month: 1..12;
  Year: Integer;
  Hours: 0..23;
  Minutes: 0..59;
  Seconds: 0..59;
end;
Ну и дальше реализовать над ним необходимые операции (при желании это все можно оформить в виде класса).

Последний раз редактировалось Arigato; 11.07.2021 в 11:30.
Arigato вне форума Ответить с цитированием
Старый 11.07.2021, 11:44   #3
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Я имею в виду, что дата и время, например, 30.12.1899 02:00:00 = -0,08333 = 0,08333 - одновременно и положительное число и отрицательное число.
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]

Последний раз редактировалось newerow1989; 11.07.2021 в 11:49.
newerow1989 вне форума Ответить с цитированием
Старый 11.07.2021, 12:34   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,542
По умолчанию

Ну это объяснимо. Если дата это целая часть, а 0 это 30.12.1899, то тут знак не играет роли, так как целая часть +0 и -0 одно и тоже. А дробная часть просто игнорируется. Получается что 30 декабря 1899 года имеет как бы две копии. Но, как мне кажется, тип TDateTime лучше не использовать для дат до 30.12.1899.
Arigato вне форума Ответить с цитированием
Старый 11.07.2021, 16:42   #5
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Придется дополнительно программировать тип TDateTime для дат до 30.12.1899 года...
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод строки в TDateTime exyl Общие вопросы Delphi 21 11.03.2018 19:44
Unix время в TDateTime Adult_Master Общие вопросы Delphi 1 19.10.2017 07:35
string to TDateTime NieL Общие вопросы Delphi 2 30.03.2009 18:43
Variant в TDateTime SoLL Общие вопросы Delphi 2 13.02.2009 11:49