Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разница между датами [D7, XP]


Страницы:   1 2 3 4 5 6 7 8 9

Andy BitOff (ppc) ©   (2007-11-08 13:07:00) 

Здравствуйте.
Что-то у меня уже башка не варит, сижу парюсь и шарики за ролики заходят...
Никак не удается получить разничу между датами в формате dd.mm.yy.
Например.
05.11.2007 и 08.11.2007 должно получиться 03.00.00, но при работе с типом дата месяц (как и год) не может быть равен 0.
Может кто подскажет как это можно реализовать?


Думкин   (2007-11-09 08:19:00) [101]


> d@nger   (09.11.07 08:07) [63]


> Johnmen ©   (08.11.07 14:54) [19]
>
> > engine ©   (08.11.07 14:36) [18]
>
> Что получится
> 29.02.1996 - 28.02.1995 = ?
> 01.03.1996 - 28.02.1995 = ?


d@nger   (2007-11-09 08:07:00) [102]

Извените, меня конечно, а разве нельзя просто сделать так:

function DatesBetween (FirstDate, SecondDate : TDateTime) : String;
var y1,m1,d1,y2,m2,d2:word;y,m,d:string;
begin
 decodedate(firstdate,y1,m1,d1);
 decodedate(seconddate,y2,m2,d2);
 y:=inttostr(y1-y2);
 m:=inttostr(m1-m2);
 d:=inttostr(d1-d2);
 result:=d+'.'+m+'.'+y;
end;


а привести допустим день 1 в вид 01, месяц 8 в вид 08, а год 1 в вид 0001, не составит труда.....

тока не кидайтесь камнями...если я не прав....


Dmitro   (2007-11-09 03:18:00) [103]


>  но и не
> > раскрывает алгоритм вычитания дат

Как раз-то и РАСКРЫВАЕТ Ваш же "многосистемный" метод. Сколько читаю эту ветку - еще не увидел ни одного абсолютного и верного ответа на вопрос (в любом варианте есть исключения).
Думаю - напишу func's для работы с дт/вр.


Германн   (2007-11-09 03:05:00) [104]

Пардон. Отнёсся к [59] слишком "бездумно". Однако стоило ужесточить мнение.
Сия функция не только
> не абсолютна и не точна
, но и не
> раскрывает алгоритм вычитания дат
.


Германн   (2007-11-09 02:54:00) [105]


> Функция не абсолютна и не точна, но раскрывает алгоритм
> вычитания дат.
> Готов выслушать критику и советы......
>

А чего тут критиковать? Сам же сказал, что "не абсолютна и не точна". Прочитай ещё раз всю ветку. Поймёшь что ты не первый и далеко не первый, кто именно такую формулировку применил.


Dmitro   (2007-11-09 02:40:00) [106]


> Германн ©   (09.11.07 02:06) [58]

Учел Ваши комментарии:
 y:= strtoint(formatdatetime('yyyy', datetimepicker1.date));
 y:= y - strtoint(formatdatetime('yyyy', datetimepicker2.date));
 y:= y * 365;
 m:= strtoint(formatdatetime('mm', datetimepicker1.date));
 m:= m - strtoint(formatdatetime('mm', datetimepicker2.date));
 if m < 0 then
   m:= m * -1;
 y:= y + m * 30;
 y:= y + strtoint(formatdatetime('dd', datetimepicker1.date)) - strtoint(formatdatetime('dd', datetimepicker2.date));

Разумеется DateTimePickerr2 всегда < DateTimePickerr1 (Value).
Функция не абсолютна и не точна, но раскрывает алгоритм вычитания дат.
Готов выслушать критику и советы......


Германн   (2007-11-09 02:06:00) [107]


> Dmitro   (09.11.07 01:47) [56]
>
>
> > Германн ©   (09.11.07 01:21) [51]
>
> Я говорил лишь о СРАВНЕНИИ дат..., уважаемый Германннн
>

Ну тогда в подобных случаях употребляй неофициальный тэг" <offtop>. Поскольку твой пост не имеет никакого отношения к сабжу. Да и всё-таки изучи синтаксис функции FormatDateTime.
А про сравнение дат см.
> Johnmen ©   (09.11.07 01:52) [57]


Johnmen   (2007-11-09 01:52:00) [108]


> Dmitro   (09.11.07 01:47) [56]
> Я говорил лишь о СРАВНЕНИИ дат...

Для лишь сравнения дат никаких преобразований вовсе не надо.


Dmitro   (2007-11-09 01:47:00) [109]


> Германн ©   (09.11.07 01:21) [51]

Я говорил лишь о СРАВНЕНИИ дат..., уважаемый Германннн


Германн   (2007-11-09 01:41:00) [110]


> korneley ©   (09.11.07 01:27) [53]
>
> Имхо тема исчерпана

Имхо, тема будет исчерпана только после того как автор темы осознает, что вышеописанное:

> Johnmen ©   (08.11.07 14:08) [16]
>
>
> > Andy BitOff (ppc)   (08.11.07 14:05) [14]
>
> Дело в том, что неглупые грамотные люди тебе уже и сказали
> и намекнули, что никак. Поясняю - ни один, тобой придуманный
> "алгоритм", не будет правильным. Т.е. не будет давать верных
> с любой т.з. решений.
> <Цитата>
>
> Andy BitOff (ppc)   (08.11.07 14:21) [17]
>
> Johnmen © (08.11.07 14:08) [16]
> Неверю.
> Любую задачу, тем более эту, можно решить/запрограммировать.
>  Другое дело сколько понадобится для этого ресурсов (чел/часов,
>  нервов и т.п).
>

означает очень большой (даже скажу слишком большой геморрой). А для чего так нужно мучиться не понятно. Может стоит упростить задачу?
(Меня как-то мой псевдоначальник попросил выводить в СтатусБаре количество минут, часов, дней, МЕСЯЦЕВ, ЛЕТ которые проработала программа :)


korneley   (2007-11-09 01:29:00) [111]

ЗЫ: А выше - тёмный. Тёмная сторона Силы привлекает сильнее...


korneley   (2007-11-09 01:27:00) [112]

Имхо тема исчерпана, т.к. все так или иначе высказались, что разница в днях может быть по разному интерпретирована в разницу в днях.месяцах.годах. Все от первой и второй даты зависит. А именно от дня, месяца и, как не странно, года. ;)


Германн   (2007-11-09 01:21:00) [113]


> Dmitro   (09.11.07 00:16) [45]
>
> function CarToInt(dt: TDate): Cardinal;
> var
>  y, m, d: string;
> begin
>  y:= formatdatetime(dt, 'yyyy');
>  m:= formatdatetime(dt, 'mm');
>  d:= formatdatetime(dt, 'dd');
>  y:= y + m + d;
>  Result:= StrToInt(y)
> end;
> Таким образом можно сравнивать любые даты т. е.:
> CarToInt("02/09/01") - CarToInt("01/09/01") = 1

Я не такой вспыльчивый как korneley ©, поэтому просто спрошу. А какое отношение имеет десятичная система счисления к многосистемному способу счисления времени и к совершенно безсистемному календарю?
Ты бы хоть сам подумал головой хоть чуть-чуть. Сравни например своим способом даты "01/01/01" и "01/02.01".
Только не удивляйся ещё и сообщениям компилятора об ошибках. Ты и стандартные функции ещё пока не знаешь.
Т.е. "КОНФЕРЕНЦИЯ" - "Начинающим" конечно. Но это не оправдание "начинающих" ответов, которые перед постированием на форум не проверяются на своём компьютере.


Johnmen   (2007-11-09 01:21:00) [114]


> SergeyIT   (09.11.07 00:06) [44]

Прошу заметить, что Вы пока только повествуете о какой-то мифической функции. Которая якобы работает без runtime ошибок и якобы выводит достоверные данные. При этом самой ф-ии не приводите. В классической философии именно это называется демагогией.
А в остальном Ваша юношеская мнительность не позволяет Вам почему-то ответить на простые, казалось бы, для Вас вопросы:
1.
15.06.2007 - 15.07.2007 = ?
15.06.2007 - 16.07.2007 = ?
15.06.2007 - 17.07.2007 = ?
15.07.2007 - 15.08.2007 = ?
15.07.2007 - 16.08.2007 = ?
15.07.2007 - 17.08.2007 = ?
2.
Что выше - кислый или темный?

ЗЫ
Впрочем, на второй можете не отвечать.


Dmitro   (2007-11-09 00:54:00) [115]


> korneley ©   (09.11.07 00:48) [49]

Не важно! Я эту хрень вспомнил из VB, т.е. VB в Excell. Там при смене версий этой хр.......и API иногда показывают разные результаты - вот и пришлось делать такие пируэты.


korneley   (2007-11-09 00:48:00) [116]


> Dmitro   (09.11.07 00:43) [48]


> НАЗВАНИЕ ФОРУМА ПРОЧИТАЙ!!!

Упс!!! Был не прав, вспылил. Опять же, считаю своё поведение безобразной ошибкой. Количество дней в месяце пошёл считать по костяшкам рук. Точно помню: впадина - меньше 31 дня. %)


Dmitro   (2007-11-09 00:43:00) [117]


> korneley ©   (09.11.07 00:29) [46]
>
> > Dmitro   (09.11.07 00:16) [45]
> >...Таким образом можно сравнивать любые даты...
>
> С любым результатом.... Прикольно... :)
>
> > CarToInt("02/09/01") - CarToInt("01/09/01") = 1
>
> а еще можно просто вычесть "таймстамп" друг из друга и получить
> разницу в днях...

НАЗВАНИЕ ФОРУМА ПРОЧИТАЙ!!!


SergeyIT   (2007-11-09 00:36:00) [118]


> Andy BitOff

Хочу добавить, что в моей функции надо обработать правильно  в d2 не только 29 февраля, но и 30 и 31 число месяца (январь, март...), а может и 29.
(Как? - подумайте.)


korneley   (2007-11-09 00:29:00) [119]


> Dmitro   (09.11.07 00:16) [45]
>...Таким образом можно сравнивать любые даты...

С любым результатом.... Прикольно... :)

> CarToInt("02/09/01") - CarToInt("01/09/01") = 1

а еще можно просто вычесть "таймстамп" друг из друга и получить разницу в днях...


Dmitro   (2007-11-09 00:16:00) [120]

function CarToInt(dt: TDate): Cardinal;
var
 y, m, d: string;
begin
 y:= formatdatetime(dt, 'yyyy');
 m:= formatdatetime(dt, 'mm');
 d:= formatdatetime(dt, 'dd');
 y:= y + m + d;
 Result:= StrToInt(y)
end;
Таким образом можно сравнивать любые даты т. е.:
CarToInt("02/09/01") - CarToInt("01/09/01") = 1
Кавычки здесь образо поставлены - туда надо реальные даты передавать!


Страницы:   1 2 3 4 5 6 7 8 9

Наверх

Титульная страница Поиск, карта сайта Написать письмо