Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема округления даты (Double) / 25 сообщений из 37, страница 1 из 2
17.11.2020, 20:27
    #40019671
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
Помогите! На Delphi 7 следующий код возвращает 0

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
uses DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  D1, D2: TDateTime;
begin
  D1 := StrToDateTime('25.11.20 00:00');
  D2 := StrToDateTime('24.11.20 23:00');
  i := HoursBetween(D1, D2);
  ShowMessage(IntToStr(i));
end;
...
Рейтинг: 0 / 0
17.11.2020, 20:29
    #40019673
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
D1 и D2 - точно даты со временем после преобразования?
...
Рейтинг: 0 / 0
17.11.2020, 20:34
    #40019675
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
wadman
D1 и D2 - точно даты со временем после преобразования?

я уже не помню точно, но не должна ли быть D1 меньше (либо равна) D2 ?
...
Рейтинг: 0 / 0
17.11.2020, 20:39
    #40019676
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
Все хуже:
HoursBetween = Round((D2-D1)*24)
(ABS я пропустил)
Так вот (D2-D1)*24 = 0.99999
...
Рейтинг: 0 / 0
17.11.2020, 20:48
    #40019678
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
А если так?
Код: pascal
1.
2.
  D1 := StrToDateTime('25.11.2020 00:00');
  D2 := StrToDateTime('24.11.2020 23:00');
...
Рейтинг: 0 / 0
17.11.2020, 20:54
    #40019681
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
Lisichkin,

Посмотрите в DateUtils код HoursBetween. В XE3 такое
Код: pascal
1.
2.
3.
4.
5.
function HoursBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Abs(DateTimeToMilliseconds(ANow) - DateTimeToMilliseconds(AThen))
    div (MSecsPerSec * SecsPerMin * MinsPerHour);
end;
...
Рейтинг: 0 / 0
17.11.2020, 21:46
    #40019698
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
в древнем xe7/8 всё чОтко
...
Рейтинг: 0 / 0
17.11.2020, 21:50
    #40019699
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
Может, в системе у ТС нестандартный формат времени?
...
Рейтинг: 0 / 0
17.11.2020, 22:01
    #40019704
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
...
Рейтинг: 0 / 0
17.11.2020, 22:11
    #40019708
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
...
Рейтинг: 0 / 0
18.11.2020, 12:53
    #40019895
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
DimaBr,

Там Trunc вместо Round стоит?
...
Рейтинг: 0 / 0
18.11.2020, 12:57
    #40019897
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
_Vasilisk_,
Ну вообще это логично: 59 минут - это не час. Но вот погрешность они не учли...
...
Рейтинг: 0 / 0
18.11.2020, 13:25
    #40019909
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
Ещё один повод перейти с Delphi 7 на что-то более новое.
...
Рейтинг: 0 / 0
18.11.2020, 17:42
    #40020048
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
К сожалению, в рамках моего проекта перейти на другую версию не возможно.

Лечится так (взял кусок из Delphi XE):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function DateTimeToMilliseconds(const ADateTime: TDateTime): Int64;
var
  LTimeStamp: TTimeStamp;
begin
  LTimeStamp := DateTimeToTimeStamp(ADateTime);
  Result := LTimeStamp.Date;
  Result := (Result * MSecsPerDay) + LTimeStamp.Time;
end;

function HoursBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Abs(DateTimeToMilliseconds(ANow) - DateTimeToMilliseconds(AThen))
    div (MSecsPerSec * SecsPerMin * MinsPerHour);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  D1, D2: TDateTime;
begin
  D1 := StrToDateTime('25.11.20 00:00');
  D2 := StrToDateTime('24.11.20 23:00');
  i := HoursBetween(D1, D2);
  ShowMessage(IntToStr(i));
end;



P.S.
Даты произвольны и никогда не приходят в систему из StrToDateTime - а взяты из базы.
...
Рейтинг: 0 / 0
18.11.2020, 17:44
    #40020055
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
Извращенец.

(D1-D2) * 24 = кол-во часов.
...
Рейтинг: 0 / 0
18.11.2020, 18:42
    #40020079
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
rgreat
Извращенец.
(D1-D2) * 24 = кол-во часов.

Не работает
...
Рейтинг: 0 / 0
18.11.2020, 19:02
    #40020090
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
DimaBr
Не работает
А как должно работать? Ну сделай так
Trunc((D1 - D2) * 24 + 1 / 36000001)
...
Рейтинг: 0 / 0
18.11.2020, 20:58
    #40020127
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
_Vasilisk_
DimaBr
Не работает
А как должно работать? Ну сделай так
Trunc((D1 - D2) * 24 + 1 / 36000001)


формула отработает правильно, если D1 > D2
Если D1 < D2, то будет отрицательное значение +1 лишний час
...
Рейтинг: 0 / 0
18.11.2020, 21:19
    #40020134
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
DimaBr
rgreat
Извращенец.
(D1-D2) * 24 = кол-во часов.

Не работает
Чего у тебя не работает?
Работа функции Round не соответствует твоим ожиданиям? ;)

Что ты написал - то и получил.
Чего хотел-то?
...
Рейтинг: 0 / 0
18.11.2020, 21:46
    #40020136
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
defecator
формула отработает правильно, если D1 > D2
Abs подразумевался
defecator
Если D1 < D2, то будет отрицательное значение +1 лишний час
Заменить Trunc ()на Int()
...
Рейтинг: 0 / 0
18.11.2020, 21:54
    #40020140
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
_Vasilisk_
defecator
формула отработает правильно, если D1 > D2
Abs подразумевался
defecator
Если D1 < D2, то будет отрицательное значение +1 лишний час
Заменить Trunc ()на Int()


не поможет
25.11.20 00:00 - 24.11.20 23:00 по формуле получится 23
24.11.20 00:00 - 25.11.20 23:00 по формуле получится -24
...
Рейтинг: 0 / 0
18.11.2020, 21:56
    #40020141
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
rgreat

>Работа функции Round не соответствует твоим ожиданиям?
Моим соответствует.

>Что ты написал - то и получил.
Что ты предложил, то я и написал, демонстрируя, что твоё предложение не работает
...
Рейтинг: 0 / 0
18.11.2020, 22:03
    #40020144
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
DimaBr
Моим соответствует.

Зачем ты тогда такую дичь с подобными округлениями написал?
Что бы запутать топик стартера?

Что ты предложил, то я и написал, демонстрируя, что твоё предложение не работает
Т.е. ты не согласен с моим утверждением что "(D1-D2) * 24 = кол-во часов."?


А уж как правильно double в integer перевести - это как бы должно быть известно каждому.
Да и не ясно, надо ли вообще в int переводить.
...
Рейтинг: 0 / 0
18.11.2020, 22:28
    #40020150
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
rgreat

>Зачем ты тогда такую дичь с подобными округлениями написал?
Предложи свой вариант округления, согласно своей же формуле

>Что бы запутать топик стартера?
Топикстартер уже нашёл верное решение, считать НЕ РАЗНИЦУ В ДАТАХ, а разницу в МИЛЛИСЕКУНДАХ

>Т.е. ты не согласен с моим утверждением что "(D1-D2) * 24 = кол-во часов."?
Как видишь, твоя идея с разницей в датах натыкается на погрешность
...
Рейтинг: 0 / 0
18.11.2020, 22:31
    #40020151
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема округления даты (Double)
DimaBr
Предложи свой вариант округления, согласно своей же формуле

Цель этого "округления"-то хоть какая?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема округления даты (Double) / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]