13-11 будет 1 или всё же 2?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

13-11 будет 1 или всё же 2?

Сообщение shyub » 12.11.2015 13:18:40

Вот пример:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
T0,T1,T2,T3: TDateTime;
begin
  T0:=StrToDateTime('11.11.2015 21:11:00');
  T1:=StrToDateTime('11.11.2015 21:13:00');
  Label1.Caption:=IntToStr(MinutesBetween(T1,T0)); // Ответ = 1.
  T2:=StrToTime('21:11:00');
  T3:=StrToTime('21:13:00');
  Label2.Caption:=IntToStr(MinutesBetween(T3,T2)); // Ответ =2.
end;

Почему такое происходит и как не потерять минуту при расчёте временного интервала между двумя событиями?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

Re: 13-11 будет 1 или всё же 2?

Сообщение SSerge » 12.11.2015 13:49:33

shyub писал(а):Почему такое происходит и как не потерять минуту при расчёте временного интервала между двумя событиями?


Не использовать TDateTime.
Эта структура абсолютно непригодна для "немемориальных" временных отметок, т.е. отметок событий, привязанных к реальным зафиксированным моментам времени с необходимостью дальнейшего вычисления интервалов между ними. То же касается функций "between". Вы сильно удивитесь результатам, пытаясь ими считать временные промежутки между моментами времени, разделенными, например переходом на летнее время или изменением характеристик часовых поясов.

Если что, есть такой Unix timestamp - число секунд с 1.01.1970 по UTC, для которого не существует извращений со сменой часовых поясов и летним временем, т.е. все промежутки между такими метками получаются абсолютно корректными и получаются элементарным сложением/вычитанием. Кроме того, само представление TDateTime как double, это что? Правильно, заведомое искажение информации из-за особенностей аппаратного представления экспоненциальных чисел.

Добавлено спустя 3 минуты 50 секунд:
Код: Выделить всё
StrToDateTime('11.11.2015 21:13:00');


Вы, кстати, не проконтролировали результат операции парсинга.
Там может оказаться вовсе не то, что подразумевалось.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 244

Рейтинг@Mail.ru